2013-07-18 7 views
129

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

पहले EntityCollection और ObjectContext पर दूसरे पर है।

प्रत्येक का उपयोग कब किया जाना चाहिए?

क्या कोई दूसरे को पसंद करता है?

Remove()bool और DeleteObject() रिटर्न void देता है।

उत्तर

255

यह आमतौर पर सही नहीं है कि आप "डेटाबेस से किसी आइटम को हटा सकते हैं" दोनों विधियों के साथ। सटीक होना यह इतना की तरह है:

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

  • EntityCollection.Remove(childEntity) निशान Deleted के रूप में माता पिता और childEntity के बीच संबंध। यदि childEntity ही डेटाबेस से हटा दिया गया है और वास्तव में क्या होता है जब आप SaveChanges फोन दो के बीच के रिश्ते के प्रकार पर निर्भर करता है:

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

    • तो रिश्ते है आवश्यक (FK NULL मूल्यों की अनुमति नहीं है) और रिश्ते की पहचान नहीं है (जिसका अर्थ है कि विदेशी कुंजी बच्चे की (संयुक्त का हिस्सा) प्राथमिक कुंजी नहीं है) आप बच्चे को किसी अन्य माता-पिता को जोड़ना होगा या आपको बच्चे को स्पष्ट रूप से हटा देना होगा (DeleteObject के साथ)। यदि आप इनमें से कोई भी नहीं करते हैं तो एक रेफरेंशियल बाधा का उल्लंघन किया जाता है और ईएफ SaveChanges - कुख्यात "The relationship could not be changed because one or more of the foreign-key properties is non-nullable" अपवाद या इसी तरह के अपवाद को अपवाद फेंक देगा।

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

मैं वास्तव में थोड़ा के बारे में उलझन में हूँ Remarks section on the MSDN page आप लिंक कर लिया है क्योंकि यह कहते हैं: "संबंध एक रेफेरेंन्शिअल सत्यनिष्ठा बाधा है, तो एक आश्रित वस्तु के निशान दोनों के रिश्ते और पर निकालें विधि बुला हटाने के लिए आश्रित वस्तु। "। यह unprecise या मेरे लिए भी गलत लगता है क्योंकि तीनों मामलों के ऊपर एक "रेफेरेंन्शिअल सत्यनिष्ठा बाधा" लेकिन पिछले मामले में बच्चे को वास्तव में नष्ट कर दिया गया है। (जब तक वे "निर्भर वस्तु" के साथ एक वस्तु है कि एक की पहचान संबंध में भाग लेता है मतलब जो हालांकि एक असामान्य शब्दावली होगा।)

+2

रेफेरेंन्शिअल सत्यनिष्ठा विकिपीडिया: रेफरेंसियल अखंडता डेटा की एक संपत्ति है, जो संतुष्ट होने पर, एक संबंध (तालिका) के एक विशेषता (कॉलम) के प्रत्येक मान को एक अलग (या समान) संबंध (तालिका) में किसी अन्य विशेषता के मान के रूप में मौजूद होने की आवश्यकता होती है, इसलिए जब रिश्ते वैकल्पिक होता है तो हम डेटा इंटीग्रटी नियम – Mohammadreza

+3

@ मोहम्मदरेज़ा को तोड़ते हैं: यदि आप 'न्यूल' को "मूल्य नहीं" के रूप में व्याख्या करते हैं (इसके बजाय "मान' NULL' "के रूप में। कभी-कभी थोड़ा सा गड़बड़ लिखा) फिर एक "वैकल्पिक संबंध" संदर्भित अखंडता की परिभाषा के विरोधाभास में नहीं है। – Slauma

+0

तो 'ObjectContext.DeleteObject' की एफई कोर संस्करण क्या है? –

11

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

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

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

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

+0

@ सलामा के जवाब की प्रतिलिपि क्यों करें? – SepehrM

+4

ठीक है, मेरे उत्तर देने वाले लोगों के लिए स्लुमा के साथ इसका कोई लेना-देना नहीं है - ** वे दोनों एक ही दस्तावेज को इंगित करते हैं **। मेरा असली जीवन उदाहरण बताता है जबकि उसका सिद्धांत इसका हिस्सा है। –

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