2010-10-06 12 views
11

ईएफ इकाई के सभी संग्रह आइटम को हटाने का सही तरीका क्या है? नीचे दिए गए कोड में, DocumentItems दस्तावेज़ के लिए संबंधित दस्तावेज़ आइटम का संग्रह है। यह कोड साफ़() पर आगे बढ़ता है लेकिन SaveChanges() पर विफल रहता है क्योंकि संबंधित आइटम एफके और एफके के माध्यम से उनके दस्तावेज़ से जुड़े होते हैं। तो मुझे लगता है कि वे साफ़() के बाद किसी भी विदेशी कुंजी के बिना हवा में तैरते रहते हैं।EntityCollection साफ़() और निकालें() विधियां

क्या मैं इसे प्रत्येक आइटम पर संग्रह कॉलिंग निकालें() पर फ़ोरैच लूप के साथ हल करता हूं या कोई और तरीका है?

// remove existing document items to prepare for refreshing them 
existing.DocumentItems.Clear(); 
// adds new Document Items 
PrepareInvoice(existing, collection); 
_repository.SaveChanges(); 

उत्तर

9

साफ़ करें बस संदर्भ को हटा दें, लेकिन entiy को हटा नहीं है।

अपनी स्थिति में

existing.DocumentItems.Clear(); 

EntitySet के सभी DocumentItems को मंजूरी दे दी हो जाएगा, लेकिन आप निकालें/वास्तविक DocumentItem हटाएं या असफल के साथ प्रतिबद्ध है, यह होगा के रूप में सिर्फ एक ही है, तो आप को हटाने का प्रयास करना होगा यह डेटाबेस में है।

आप पाश की जरूरत है के माध्यम से कोई भी संदर्भ को अलग, और फिर इकाई आप (अपने नल जब तक और अपनी स्थिति है ना में)


वैकल्पिक रूप से निकालना चाहते हैं हटा सकते हैं, मैं कार्यान्वयन कि स्पष्ट का उपयोग देखा है , और एक एसोसिएशन चेंजहैंडलर स्वचालित रूप से पुरानी वस्तु को हटाने के लिए। असल में यदि परिवर्तन एक "हटाएं/हटाएं" है तो यह अनाथ वस्तु पर DeleteObject() को कॉल करता है।

+5

सबसे पहले मुझे लगता है कि यह विडंबना है कि हम कैसे स्पष्ट हैं कि 'साफ़' अस्पष्ट है। मेरी समझ यह है कि वे अलग हैं। साफ़ करें बस इन ऑब्जेक्ट्स को पॉइंटर को (स्मृति में) हटा दें। 'निकालें' कहता है मेरी सूची से निकालें और हटाने के लिए चिह्नित करें ... अगर मैंने कुछ भी अमान्य कहा है तो कृपया मुझे सही करें। – Nix

0

बस जवाब देने के लिए निक्स टिप्पणी करने के लिए जवाब देने के लिए,

मुझे लगता है कि EntityCollection.Remove विधि केवल हटाने के लिए अंक रिश्ते और न संस्थाओं, EntityCollection.Clear विधि करता है बस के रूप में।

मुझे पता है कि प्रलेखन कहता है कि इकाई को हटाने के लिए भी चिह्नित किया जाएगा, लेकिन मेरे परीक्षण में मुझे वर्णित व्यवहार मिला है (कोई मुझे बता सकता है क्यों?)।

तो, यदि आपके अवधारणात्मक मॉडल में कई विदेशी कुंजी बाधाओं में से एक है, तो आप दृढ़ता स्टोर में संदर्भ में परिवर्तनों को सहेज नहीं सकते हैं।

मुझे मिला एकमात्र तरीका (क्योंकि मैं कैस्केडडेलेट नहीं करना चाहता) बच्चों के माध्यम से लूपिंग कर रहा है और संदर्भ का आह्वान कर रहा है। उनमें से प्रत्येक पर हटाएं, इस प्रकार इकाई और संबंधित रिश्ते को हटा दें।

13

संग्रह में आइटम को हटाने का यह एक तरीका है।

वीबी

TEntityCollection.ToList().ForEach(Sub(o) ctx.DeleteObject(o)) 

सी #

TEntityCollection.ToList().ForEach(x => ctx.DeleteObject(x)) 

तो फिर तुम वर्ष कॉल करने के लिए

ctx.SaveChanges() 
+0

यह ईएफ 6 में कैसे किया जाता है? – vijayst

+0

मुझे लगता है कि ईएफ 6 में एक नई विधि है जिसे RemoveRange नामक एक नई विधि है, मैंने वास्तव में इसका उपयोग नहीं किया है, लेकिन किसी के लिए एक लिंक है:)। http://stackoverflow.com/questions/21568479/how-can-i-delete-1-000-rows-with-ef6 –

+0

निकालें रेंज इसे ठीक करें। धन्यवाद। – vijayst

1

हाँ, एक साल की जरूरत है, लेकिन एक छोटी सी टिप्पणी पर ...के बाद से DeleteObject एक पैरामीटर है, जो लैम्ब्डा अभिव्यक्ति के लिए तर्क के रूप में एक ही प्रकार है लेता है, तो आप सिर्फ उपयोग कर सकते हैं:

entityCollection.ToList().ForEach(ctx.DeleteObject); 

मुझे यकीन है कि नहीं कर रहा हूँ अगर वीबी एक ऐसी ही वाक्य रचना का समर्थन करता है, हालांकि। किसी को?

1

चाल: माता-पिता और बच्चे के बीच संबंध स्थापित करते समय, आपको बच्चे पर "समग्र" कुंजी बनाना होगा। इस तरह, जब आप माता-पिता को 1 या उसके सभी बच्चों को हटाने के लिए कहते हैं, तो संबंधित रिकॉर्ड वास्तव में डेटाबेस से हटा दिए जाएंगे। तब

modelBuilder.Entity<Child>.HasKey(t => new { t.ParentId, t.ChildId }); 

, संबंधित बच्चों को हटाने के लिए:

Fluent एपीआई का उपयोग कर समग्र कुंजी कॉन्फ़िगर करने के लिए

var parent = _context.Parents.SingleOrDefault(p => p.ParentId == parentId); 

var childToRemove = parent.Children.First(); // Change the logic 
parent.Children.Remove(childToRemove); 

// or, you can delete all children 
// parent.Children.Clear(); 

_context.SaveChanges(); 

हो गया!

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