2011-03-27 9 views
26

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

मेरे डिजाइन:

मैं तीन इकाई प्रकार, MainEntity, EntityTypeA और EntityTypeB है। EntityTypeA और EntityTypeB हटाते समय ईएफ को कैस्केड हटाने का उपयोग करने के लिए कॉन्फ़िगर किया गया है। दूसरे शब्दों में, यदि मैं MainEntity का उदाहरण हटा देता हूं, तो मुझे सभी संबंधित EntityTypeA और EntityTypeB उदाहरण भी हटाए जाने चाहिए। मैंने EntityTypeA या EntityTypeB को अपने माता-पिता को हटाने के बिना कभी भी हटा नहीं दिया।

मेरी समस्या यह है कि ईएफ स्पष्ट रूप से DELETE स्टेटमेंट EntityTypeA के लिए बताता है, जिससे मेरा एप्लिकेशन क्रैश हो जाता है।

यह वही अपने मॉडल की तरह लग रही है:

संबंधों निम्नलिखित गैर-डिफ़ॉल्ट config है:

  • MainEntity -> EntityTypeA OnDelete: Cascade
  • MainEntity -> EntityTypeB OnDelete: Cascade

संबंधEntityTypeA -> EntityTypeBOnDelete: None

डाटाबेस सामग्री है

INSERT INTO MainEntities (Name) values ('Test') 
insert into EntityTypeA (MainEntityID) VALUES (1) 
insert into EntityTypeB (MainEntityID, EntityTypeAId) VALUES (1, 1) 
insert into EntityTypeB (MainEntityID, EntityTypeAId) VALUES (1, 1) 

मेरे कोड:

class Program 
{ 
    static void Main(string[] args) 
    { 
     var context = new Model1Container(); 
     var mainEntity = context.MainEntities.Include("EntityTypeA").SingleOrDefault(); 
     context.DeleteObject(mainEntity); 
     context.SaveChanges(); 
    } 
} 

क्या

होता है जब मैं SaveChanges, इकाई की रूपरेखा फोन कार्यान्वित डेटाबेस में निम्नलिखित:

exec sp_executesql N'delete [dbo].[EntityTypeA] 
where ([Id] = @0)',N'@0 int',@0=1 

यह एक विदेशी कुंजी उल्लंघन का कारण बनता है क्योंकि वहाँ EntityTypeB की मेज संदर्भित EntityTypeA मामलों में आइटम हैं।

प्रश्न

क्यों इकाई की रूपरेखा मुद्दा एक स्पष्ट EntityTypeA के उदाहरण के लिए हटाना है, भले ही मैं इकाई की रूपरेखा व्यापक हटाता उपयोग करने के लिए कॉन्फ़िगर कर दिया है? अगर मैं शामिल ("EntityTypeA") को हटा देता हूं तो यह फिर से काम करना शुरू कर देता है।

+10

छवि (अपने मॉडल की) है आपके उत्तर के लिए अनुपलब्ध – flipchart

उत्तर

41

यह वास्तव में कैफेडिंग डेलीज़ ईएफ में कैसे व्यवहार करता है। ईएफ डिजाइनर में एक रिश्ते पर कैस्केड सेट करना प्रत्येक भारित वास्तविक इकाई के लिए DELETE कथन निष्पादित करने के लिए ईएफ को निर्देशित करता है। यह डेटाबेस में ON CASCADE DELETE के बारे में कुछ भी नहीं कहता है।

  • सेट कास्केड एफई डिजाइनर में संबंध पर:

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

  • डेटाबेस में संबंध पर ON CASCADE DELETE सेट करें। यह एसक्यूएल को सभी संबंधित रिकॉर्ड्स को हटाने के लिए निर्देश देगा जो माता-पिता को हटाने के समय संदर्भ पर लोड नहीं किए गए थे।

झरना के कार्यान्वयन एफई में हटा देता है अजीब और काफी अप्रभावी है, लेकिन यह है कि यह कैसे बर्ताव करता है और आप इसका इस्तेमाल करना चाहते हैं, आप इस परिदृश्य में सही ढंग से कार्य करने के लिए अपने आवेदन संशोधित करना होगा।

+2

धन्यवाद! (जब मैं अपना डेटाबेस मॉडल एसक्यूएल स्क्रिप्ट उत्पन्न करता हूं, तो ईएफ में SQL स्टेटमेंट्स में कैस्केड डिलीट शामिल होता है यदि मैंने अपने इकाई डेटा मॉडल में कैस्केड सक्षम किया है, तो मैं यह कह रहा था कि ईएफ इस पर निर्भर करेगा।) – Nitramk

5

ईएफ डिजाइनर के बजाय, कोई डेटाबेस में एफके प्रतिबंधों पर कैस्केड हटाना भी सेट कर सकता है।

कैस्केडिंग डिलीट को सेट करने के तरीके पर एसक्यूएल सर्वर प्रबंधन स्टूडियो (एसएसएमएस) से दृश्य चरण यहां दिए गए हैं।

नोट करते समय ध्यान दें, को भूलना न भूलें, हटाए जाने से पहले डेटाबेस के विरुद्ध edmx अद्यतन करें।

enter image description here

मैं अपने ब्लॉग पर और अधिक गहराई में इस पर चर्चा: Entity Framework Cascading Deletes; Set it from the database.

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