2011-04-03 15 views
35

मैं पहले कोड का उपयोग करके अपना डेटाबेस डिज़ाइन कर रहा हूं और मुझे लगता है कि मुझे थोड़ी मदद चाहिए।इकाई फ्रेमवर्क कोड पहले - परिभाषित रिश्ते/कुंजी

Introducing FOREIGN KEY constraint 'SalesOrder_Invoices' on table 'Invoices' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
Could not create constraint. See previous errors.

मैं निम्नलिखित संबंध/कुंजी के लिए कोशिश कर रहा हूँ:

मैं इस त्रुटि हो रही है -> CustomerLocation

  • CustomerLocation -

    --> = 1 to Many Relationship 
    
    1. ग्राहक> SalesOrder
    2. SalesOrder -> चालान
    3. Salesrep -> SalesOrder
    4. PaymentTerm -> ग्राहक
    5. PaymentTerm -> SalesOrder
    6. PaymentTerm -> चालान

    मैं उन्हें परिभाषित करने के लिए कोशिश कर रहा हूँ मानक के अनुसार:

    <ClassName><PrimaryKeyID> 
    

    उदाहरण: Customer, ID संपत्ति है, इसलिए CustomerLocation में मैं बहुत की तरह विदेशी कुंजी निर्धारित:

    Public Property CustomerID AS Integer 
    

    सभी मैं क्या करना है विदेशी कुंजी सही परिभाषित किया जाता है? क्या मुझे परिभाषित प्रत्येक कुंजी के लिए नेविगेशन गुण भी होना चाहिए?

    और, क्या मेरे पास किसी ऑब्जेक्ट की प्राथमिक प्राथमिक कुंजी पर एकाधिक विदेशी कुंजी नहीं हो सकती हैं?

    अपडेट किया गया

    तो एक रिश्ते को परिभाषित करने के लिए, आप ClassName.PrimaryKeyProperty प्रयोग करते हैं? या आप नेविगेशन गुणों का उपयोग करते हैं? अथवा दोनों? उलझन में !!

    अद्यतन 2

    तो एक रिश्ता काम आप दोनों पक्षों को परिभाषित करने के लिए है बनाने के लिए ... मुझे लगता है।

    Public Class Customer 
        Public Property ID AS Integer 
        Public Overrideable Property Locations AS ICollection(OF CustomerLocation) 
    
    End Class 
    
    Public Class CustomerLocation 
        Public Property ID AS Integer 
        Public Property CustomerID AS Integer 
    
    End Class 
    
  • उत्तर

    95

    यह SQL सर्वर द्वारा अपवाद है जब आपके पास कैस्केड डिलीट के कई पथ हैं। यदि आप अपना पेमेंटटर्म हटाते हैं तो यह तीनों रिश्तों पर कैस्केड हटा देगा। SalesOrder या Invoice बनाते समय यह उड़ाएगा।एफई डिफ़ॉल्ट रूप से बनाता है सभी एक-से-कई ON DELETE CASCADE के साथ संबंधों को आप से इसका इस्तेमाल नहीं करने के लिए अपने विशिष्ट संबंध पुन: मैप कर सकते हैं:

    modelBuilder.Entity<...>() 
          .HasRequired(...) 
          .WithMany(...) 
          .HasForeignKey(...) 
          .WillCascadeOnDelete(false); 
    

    या आप सम्मेलन को निकाल कर इसे बंद कर सकते globaly:

    modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>(); 
    

    AddForeignKey("dbo.Payments", "EventID", "dbo.Events", "EventID", cascadeDelete: true) 
    

    और बदल वें:

    आप इस तरह की एक पंक्ति कुछ के साथ संपादन उत्पन्न Up() विधि द्वारा एक विशेष प्रवास पर इस त्रुटि के आसपास प्राप्त कर सकते हैं cascadeDelete: पर अपमानजनक संबंधों पर झूठ का मूल्य।

    +0

    तो रिश्ते का काम करने के लिए, आपको दोनों पक्षों को परिभाषित करना होगा? कृपया ऊपर मेरा अपडेट देखें। – Sam

    +0

    @ सैम: नहीं, आपको दोनों तरफ नेविगेशन संपत्ति की आवश्यकता नहीं है। –

    +13

    मुझे इस जवाब को 'OneToManyCascadeDeleteConvention' टिप' के लिए पसंद है। – batwad

    4

    पढ़ें this, मुझे यकीन है कि यह आप इस सवाल का जवाब खोजने में मदद मिलेगी हूँ।

    इसके अलावा, ScottGu के blogpost के अनुसार, मैं सामान्य रूप में लगता है कि यह होना चाहिए कि आप बस (ताकि आप इसे अधिक जानकारी के लिए बाहर की जाँच करनी चाहिए मैं इसे ध्यान से काफी पढ़ा नहीं था,) के रूप में कक्षाएं बनाने:

    public class Customer 
    { 
        public int CustomerID { get; set; } 
        public int CustomerLocationID { get; set; } 
        public virtual CustomerLocation Location { get; set; } 
    } 
    
    public class CustomerLocation 
    { 
        public int CustomerLocationID { get; set; } 
        public virtual ICollection<Customer> Customers { get; set; } 
    } 
    
    संबंधित मुद्दे