2014-07-15 8 views
7

मैं पहले ईएफ कोड का उपयोग कर रहा हूं। एक साधारण मॉडल:इकाई फ्रेमवर्क डीबीकॉन्टेक्स्ट .रोम (ओबीजे) बनाम इंन्ट्री (ओबीजे) .टेट = एंटीटीस्टेट। हटाया गया

item { public int Id {set; get;},... ,ICollection<ItemImages> {set; get;} } 

    itemImages { 
     public int Id {set; get; }, 
     public int ItemId {set; get; } 
      , ... , 
     public Item Item {set; get; } 
     } 

ItemConfig:EntityTypeConfiguration<Item> 
{ 
//some config statement; 
//... 
// mark child delete when parent delete: waterfall delete. 
HasRequired(rs => rs.ItemCat).WithMany(rs => rs.Items).HasForeignKey(rs => rs.ItemCatId).WillCascadeOnDelete(true); 
} 

जब निकालें() द्वारा नष्ट इकाई, यह आइटम और संबंधित बच्चे (आइटम छवियों रिकॉर्ड) अच्छी तरह से हटा दें।

_db.Item.Remove(DeleteThisObj); 
_db.SaveChanges(); 

लेकिन निशान इसे हटाने के लिए जब:

_db.Entry(DeleteThisObj).State = EntityState.Deleted; 
_db.SaveChanges(); 

प्राप्त त्रुटि:

The operation failed: The relationship could not be changed because one or more of the foreign-key properties is non-nullable. When a change is made to a relationship, the related foreign-key property is set to a null value. If the foreign-key does not support null values, a new relationship must be defined, the foreign-key property must be assigned another non-null value, or the unrelated object must be deleted.

+0

संभावित डुप्लिकेट [इकाई की रूपरेखा .remove() बनाम .DeleteObject()] (http://stackoverflow.com/questions/17723626/entity-framework- हटाएं-बनाम डिलीटोजेक्ट) –

उत्तर

14

तुम सच में नष्ट कर दिया गया उपयोग करना चाहते हैं, तो आप अपने विदेशी कुंजी नल बनाने के लिए होगा, लेकिन फिर आप अनाथ रिकॉर्ड के साथ समाप्त हो जाएंगे (जो मुख्य कारणों में से एक है जिसे आपको पहले स्थान पर नहीं करना चाहिए)। तो बस Remove()

ObjectContext.DeleteObject(entity) संदर्भ में हटाए गए इकाई को चिह्नित करता है। (इसके बाद EntityState हटा दिया गया है।) यदि आप SaveChanges को कॉल करते हैं तो ईएफ डेटाबेस में SQL DELETE कथन भेजता है। यदि डेटाबेस में कोई संदर्भित बाधाओं का उल्लंघन नहीं किया जाता है तो इकाई हटा दी जाएगी, अन्यथा अपवाद फेंक दिया जाएगा।

EntityCollection.Remove(childEntity) हटाए गए माता-पिता और बच्चे के बीच संबंधों को चिह्नित करता है। यदि बच्चे सेन्टिटी स्वयं डेटाबेस से हटा दी जाती है और जब आप SaveChanges को कॉल करते हैं तो वास्तव में क्या होता है:

यदि संबंध वैकल्पिक है, यानी विदेशी कुंजी जो बच्चे से माता-पिता को संदर्भित करती है डेटाबेस नल मानों की अनुमति देता है, यह विदेशी शून्य पर सेट हो जाएगा और यदि आप SaveChanges को बच्चे के लिए यह कुल मान कहते हैं तो डेटाबेस डेटाबेस में लिखा जाएगा (यानी दोनों के बीच संबंध हटा दिया गया है)। यह SQL अद्यतन विवरण के साथ होता है। कोई डिलीट कथन नहीं होता है।

यदि संबंध आवश्यक है (एफके नल मूल्यों की अनुमति नहीं देता है) और रिश्ते की पहचान नहीं हो रही है (जिसका अर्थ है कि विदेशी कुंजी बच्चे की (समग्र) प्राथमिक कुंजी का हिस्सा नहीं है) आपको या तो जोड़ना होगा बच्चे को किसी अन्य माता-पिता के लिए या आपको बच्चे को स्पष्ट रूप से हटा देना होगा (तब DeleteObject के साथ)। यदि आप इनमें से कोई भी नहीं करते हैं तो एक रेफरेंशियल बाधा का उल्लंघन किया जाता है और जब आप SaveChanges को कॉल करते हैं तो ईएफ अपवाद फेंक देगा - कुख्यात "रिश्ते को बदला नहीं जा सका क्योंकि एक या अधिक विदेशी-कुंजी गुण गैर-निष्पादन योग्य" अपवाद है या इसी के समान।

यदि संबंध पहचान रहा है (यह आवश्यक है क्योंकि प्राथमिक कुंजी का कोई भी हिस्सा न्यूल नहीं हो सकता है) ईएफ बच्चे को एंटीटी को भी हटाएगा। यदि आप SaveChanges को कॉल करते हैं तो एक SQL DELETE कथन डेटाबेस में भेजा जाएगा। यदि डेटाबेस में कोई अन्य संदर्भित बाधाओं का उल्लंघन नहीं किया जाता है तो इकाई हटा दी जाएगी, अन्यथा अपवाद फेंक दिया जाएगा।

ध्यान देने योग्य एक बात यह है कि स्थापना के .State = EntityState.Deleteddoes not trigger automatically detected change.

की
+0

तो निकालें() को हटाए गए लेकिन प्रविष्टि (obj) .state = EntityStae के रूप में संदर्भ में बच्चों के राज्य रिकॉर्ड को चिह्नित करें। हटाया गया नहीं है? असल में मैं पानी गिरना चाहता हूं – Mohammadreza

+1

@ मोहम्मदरेजा आप इस तरह से सोच सकते हैं, 'निकालें' रिकॉर्ड और रिश्तों को प्रभावित करता है जबकि 'हटाएं' हाथ पर रिकॉर्ड को प्रभावित करता है। –

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