2013-10-15 4 views
29

मैं यह त्रुटिविदेशी कुंजी बाधा चक्र या एक से अधिक झरना रास्तों का कारण हो सकता परिचय

'क्षेत्र' चक्र या एक से अधिक झरना रास्तों का कारण हो सकता मेज पर विदेशी कुंजी बाधा 'FK_dbo.Regions_dbo.Countries_CountryId' का परिचय हो रही है । कोई कार्रवाई या पर कोई कार्रवाई अद्यतन करें, या अन्य विदेशी कुंजी बाधाओं को संशोधित करें पर निर्दिष्ट करें। बाधा उत्पन्न नहीं कर सका। पिछली त्रुटियां देखें।

मुझे आश्चर्य है कि इसका मतलब है कि मेरा डेटाबेस डिज़ाइन खराब है? मैंने पढ़ा है कि आप कैस्केड या उस तरह कुछ बंद कर देते हैं, लेकिन मुझे यकीन नहीं है कि यह गलीचा से समस्या को दूर कर रहा है या नहीं।

मैं सिर्फ अपने डोमेन वर्ग के माध्यम से ईएफ को अपनी टेबल जेनरेट करने दे रहा हूं (मैं इस बिंदु पर किसी भी डेटा एनोटेशन या धाराप्रवाह मैपिंग का उपयोग नहीं कर रहा हूं)।

 public class Country 
     { 
      public Country() 
      { 
       this.Stores = new List<Store>(); 
       this.Regions = new List<Region>(); 
       Id = GuidCombGenerator.GenerateComb(); 
      } 

      public Guid Id { get; private set; } 

      private string name; 

      public string Name 
      { 
       get { return name; } 
       set 
       { 
        name = value.Trim(); 
       } 
      } 

      private string code; 

      public string Code 
      { 
       get { return code; } 
       set 
       { 
        code = value.Trim(); 
       } 
      } 

      public virtual ICollection<Store> Stores { get; set; } 
      public virtual ICollection<Region> Regions { get; set; } 
     } 


      public class City 
     { 
      public City() 
      { 
       this.Stores = new List<Store>(); 
       Id = GuidCombGenerator.GenerateComb(); 
      } 

      public Guid Id { get; private set; } 

      private string name; 

      public string Name 
      { 
       get { return name; } 
       set 
       { 
        name = value.Trim(); 
       } 
      } 


      public Guid RegionId { get; set; } 
      public virtual Region Region { get; set; } 

      public virtual ICollection<Store> Stores { get; set; } 
     } 


      public class Region 
     { 
      public Region() 
      { 
       this.Cities = new List<City>(); 
       this.Stores = new List<Store>(); 


       Id = GuidCombGenerator.GenerateComb(); 
      } 

      public Guid Id { get; private set; } 


      private string state; 

      public string State 
      { 
       get { return state; } 
       set 
       { 
        state = value.Trim(); 
       } 
      } 


      public Guid CountryId { get; set; } 
      public virtual ICollection<City> Cities { get; set; } 
      public virtual Country Country { get; set; } 
      public virtual ICollection<Store> Stores { get; set; } 
     } 


    public class Store 
    { 
     public Store() 
     { 
      Id = GuidCombGenerator.GenerateComb(); 

      Users = new List<User>(); 
     } 

     public Guid Id { get; private set; } 

     public Guid CountryId { get; set; } 
     public Guid CityId { get; set; } 
     public Guid RegionId { get; set; } 
     public virtual City City { get; set; } 
     public virtual Country Country { get; set; } 
     public virtual Region Region { get; set; } 

     public virtual ICollection<User> Users { get; set; } 

    } 

क्या यह स्टोरों की वजह से हो सकता है?

+0

आप हमें शामिल टेबल, क्या उनकी संरचना है, और सबसे महत्वपूर्ण दिखा सकते हैं: कैसे उनके बीच एफके बाधाएं स्थापित की गई हैं? तो आप क्षेत्रों और देशों के बीच एक कैस्केडिंग डिलीट स्थापित करना चाहते थे, ताकि यदि कोई देश हटा दिया गया हो, तो इसके सभी क्षेत्रों को हटा दिया गया है? उचित लगता है - सवाल यह है: यह चक्र क्यों बनाता है?कैस्केडिंग डिलीट के साथ अन्य एफके बाधाएं आपके पास पहले से मौजूद हैं? –

+0

ठीक है, मैंने इसे उन क्षेत्रों को दिखाने के लिए अपडेट किया है, मेरे पास अभी तक कोई भी टेबल नहीं है क्योंकि मैं पहले कोड कर रहा हूं। – chobo2

+0

दुर्भाग्यवश, आप हमें 'स्टोर' श्रेणी नहीं दिखा रहे हैं .... और मुझे कोई कोड नहीं दिख रहा है जो कैस्केडिंग डिलीट को परिभाषित करता है, या तो ... –

उत्तर

54

अपने मॉडल में सभी रिश्तों की आवश्यकता है क्योंकि सभी विदेशी कुंजी गुण (CountryId, RegionId, CityId) नल नहीं कर रहे हैं। आवश्यक एक से कई रिश्तों के लिए ईएफ सम्मेलन द्वारा कैस्केडिंग हटाने को सक्षम करेगा।

Country और RegionStore तालिका करने के लिए कई हटाने पथ है, उदाहरण के लिए यदि आप एक Country संबंधित Store रों तीन अलग अलग व्यापक पथ (जो SQL सर्वर के साथ अनुमति नहीं है) के माध्यम से हटाया जा सकता है हटा दें:

  • Country ->Store
  • Country ->Region ->Store
  • Country ->Region ->City ->Store

आप Fluent एपीआई का उपयोग कर हटा सकते हैं या तो अक्षम करने कैस्केडिंग द्वारा इस तरह के अस्पष्ट हटाने रास्तों से बचना चाहिए (एक नल विदेशी कुंजी Guid? के साथ) के रूप में वैकल्पिक संबंधों के कुछ को परिभाषित करते हुए।

या City को छोड़कर सभी इकाइयों से Stores संग्रह (और व्यस्त संदर्भ और एफके गुण) को हटा दें। मेरे लिए उन संग्रहों को अनावश्यक लग रहा है क्योंकि आप Regions.Cities.Stores संग्रहों के माध्यम से नेविगेट करके Country में सभी स्टोर ढूंढ सकते हैं।

+0

तो स्टोर केवल शहर के साथ संबंध होगा? – chobo2

+0

@ chobo2: हाँ, मुझे लगता है कि यह पर्याप्त होगा। – Slauma

+12

+1 सूचनात्मक; Argh, एसक्यूएल सर्वर के हिस्से पर यह प्रतिबंध कष्टप्रद है। कई स्थितियों में, आपके पास एक सारणी है जो दो तालिकाओं के बीच कई से अधिक रिश्तों को लागू करती है, और आप संबंध तालिका में उन दोनों तालिकाओं में गैर-निरर्थक विदेशी कुंजी रखना चाहते हैं, और इनमें से किसी एक को हटा दिया है उन तालिकाओं रिलेशनशिप टेबल के लिए cascade। तो मुझे लगता है कि हम विदेशी कुंजीों में से एक को छोड़ने के बहुत ही गैर-आदर्श समाधान के साथ छोड़े गए हैं। या तो हर बार कस्टम ट्रिगर्स को लागू या लागू करना। क्या एक पिटा है – Shavais

24

modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>()OnModelCreating विधि में अपने DataContext फ़ाइल का पालन करें:

public class YourDataContext : DbContext 
{ 
    public DbSet<Country> Countries{ get; set; } 
    ... 


    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>(); 

    } 
} 

वही सवाल: entity-framework-how-to-solve-foreign-key-constraint-may-cause-cycles-or-multi

+18

यह एक समाधान नहीं है, जो समस्या के आसपास काम कर रहा है। – Sebazzz

+4

यह सही समाधान है जब आपके पास स्कीमा डिज़ाइन पर कोई नियंत्रण नहीं है। – Askolein

+0

तो · lu · tion səlo͞oSH (ə) n/ संज्ञा 1. किसी समस्या को हल करने या कठिन परिस्थिति से निपटने का साधन। –

संबंधित मुद्दे