एंटिटी फ्रेमवर्क .Rove () बनाम .DeleteObject ()


141

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

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

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

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

Remove()एक रिटर्न boolऔर DeleteObject()रिटर्न void

जवाबों:


275

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

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

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

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

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

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

मैं वास्तव में MSDN पृष्ठ पर आपके द्वारा लिंक किए गए रिमार्क्स अनुभाग के बारे में थोड़ा उलझन में हूं क्योंकि यह कहता है: " यदि संबंध में एक संदर्भात्मक अखंडता बाधा है, तो हटाए गए ऑब्जेक्ट को एक आश्रित वस्तु पर कॉल करना रिश्ते और हटाने के लिए आश्रित वस्तु दोनों को चिह्नित करता है। "। यह मेरे लिए अनिश्चित या यहां तक ​​कि गलत लगता है क्योंकि उपरोक्त सभी तीन मामलों में एक " संदर्भात्मक अखंडता बाधा " है, लेकिन केवल आखिरी मामले में बच्चा वास्तव में हटा दिया गया है। (जब तक कि वे " आश्रित वस्तु " से तात्पर्य एक ऐसी वस्तु से न हो जो एक पहचान वाले रिश्ते में भाग लेती है जो एक असामान्य शब्दावली होगी।)


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

3
@ मोहम्मदरेज़ा: यदि आप NULL"नॉट वैल्यू" ("वैल्यू" के बजाय NULLजैसा कि मैंने कभी-कभी थोड़ा सा मैला लिखा है) की व्याख्या करते हैं तो "वैकल्पिक संबंध" संदर्भात्मक अखंडता की उस परिभाषा के विपरीत नहीं है।
सुलामा

1
तो ईएफ कोर संस्करण क्या है ObjectContext.DeleteObject?
जोनाथन एलन

13

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

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

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

ध्यान देने योग्य बात यह है कि सेटिंग .State = EntityState.Deleted स्वचालित रूप से पहचाने गए परिवर्तन को ट्रिगर नहीं करती है। ( संग्रह )


4
ठीक है, उन लोगों के लिए, जिन्होंने मेरे जवाब को डाउन-वोट किया है, उनका सुलेमा से कोई लेना-देना नहीं है - वे दोनों एक ही दस्तावेज की ओर इशारा करते हैं । मेरा वास्तविक जीवन उदाहरण बताते हैं जबकि उसका सिद्धांत इसका हिस्सा है।
माटस वैतकेविसियस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.