2009-02-02 10 views
39

मुझे पूरा यकीन है कि मैंने कहीं इस सवाल का जवाब देखा है, लेकिन जैसा कि मुझे इसे SO या google पर दो खोजों के साथ नहीं मिला, मैं इसे फिर से पूछता हूं ...मैं बिना किसी लोडिंग के एंटिटी फ्रेमवर्क मॉडल से किसी ऑब्जेक्ट को कैसे हटा सकता हूं?

इकाई फ्रेमवर्क में , एक डेटा वस्तु को नष्ट करने के लिए एक ही रास्ता

MyEntityModel ent = new MyEntityModel(); 
ent.DeleteObject(theObjectToDelete); 
ent.SaveChanges(); 

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

अगर वहाँ एक समझदारी भरा तरीका Linq या लैम्ब्डा अभिव्यक्ति का उपयोग करते है, वह भी ठीक है। मुख्य उद्देश्य, हालांकि, इसे हटाने के लिए डेटा लोड करने से बचाना है।

+2

की तुलना में अधिक की आवश्यकता हो सकती है वहाँ ऐसा करने के लिए एक रास्ता है कर सकते हैं यह अच्छा और सामान्य रूप से: http://j.mp/f0x0Bh – BritishDeveloper

+0

@ ब्रितिश डेवलपर: दिलचस्प! हालांकि, मेरे पास इस सवाल के बाद एहसास हुआ कि पहले इकाई को पुनः प्राप्त करने का अक्सर अच्छा कारण है, कम से कम यदि विदेशी कुंजी संबंध शामिल हैं। –

+0

[संभावित ढांचे के साथ आईडी द्वारा ऑब्जेक्ट को कैसे हटाएं] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/2471433/how-to-delete-an-object-by-id-with-entity-framework) –

उत्तर

19

पर यह जानते हुए भी कि इकाई की रूपरेखा संस्थाओं और इकाई एसक्यूएल को Linq करने के लिए दोनों का समर्थन करता है लायक है। यदि आप पाते हैं अपने आप को हटाता है या अद्यतन है कि संभावित आप ExecuteNonQuery के बराबर उपयोग कर सकते हैं कई रिकॉर्ड को प्रभावित कर सकते करना चाहते थे।

इकाई एसक्यूएल में इस तरह

Using db As New HelloEfEntities 

     Dim qStr = "Delete " & _ 
        "FROM Employee" 
     db.ExecuteStoreCommand(qStr) 
     db.SaveChanges() 
    End Using 

लग सकता है इस उदाहरण में, db मेरी ObjectContext है। यह भी ध्यान रखें कि ExecuteStoreCommand फ़ंक्शन पैरामीटर का एक वैकल्पिक सरणी लेता है।

+2

यह उत्तर सीधे पूछताछ करने वाले उत्तर के रूप में चिह्नित किया जाना चाहिए और स्वीकार किए गए उत्तर के रूप में चिह्नित किया जाना चाहिए। कुछ समाधानों से इकाई बनाने जैसे अन्य समाधान कम इष्टतम हैं। यह भी देखें http://msdn.microsoft.com/en-us/library/ee358769.aspx – mare

+17

ExecuteStoreCommand के बाद आप SaveChanges को क्यों कॉल कर रहे हैं? – epotter

+7

जादू स्ट्रिंग! ओह। – mayu

8

मैं this post, जिसमें कहा गया है कि वहाँ वास्तव में रिकॉर्ड हटाने के लिए कोई बेहतर तरीका है पाया। स्पष्टीकरण दिया गया था कि इस रिकॉर्ड के लिए अद्वितीय सभी विदेशी कुंजी, संबंध आदि भी हटा दिए गए हैं, और इसलिए ईएफ को रिकॉर्ड के बारे में सही जानकारी की आवश्यकता है। मैं द्वारा क्यों इस डेटा आगे पीछे लोड हो रहा है बिना प्राप्त नहीं किया जा सकता है हैरान हूँ, लेकिन के रूप में यह बहुत बार ऐसा नहीं हो रहा है मैं (अब के लिए) का फैसला किया है कि मैं परेशान नहीं करेगा।

आप इस समस्या का समाधान है, तो मुझे पता है करने के लिए स्वतंत्र अग्रिम में

+3

संग्रहीत प्रक्रिया का उपयोग करने के बारे में कैसे करें? –

4

क्षमा याचना महसूस =), लेकिन मैं अपने लक्ष्य पर सवाल खड़ा किया है।

क्या तुमने कभी बिना पढ़े एक वस्तु को हटाते हैं, तो आप किसी अन्य उपयोगकर्ता बार जब आप इस बात की पुष्टि है कि आप वस्तु को हटाने के लिए वास्तविक हटाना चाहता था और बीच में वस्तु से बदल गया है, तो पता नहीं कर सकते हैं। "सादे पुराने एसक्यूएल" में, ऐसा करने जैसा होगा:

DELETE FROM FOO 
WHERE ID = 1234 
बेशक

, ज्यादातर लोगों को वास्तव में ऐसा नहीं करते हैं। इसके बजाय, वे की तरह कुछ कार्य करें:

DELETE FROM FOO 
WHERE ID = 1234 
    AND NAME = ?ExpectedName AND... 

मुद्दा यह है कि हटाना (कुछ भी नहीं) असफल चाहिए किसी अन्य उपयोगकर्ता अंतरिम में रिकॉर्ड बदल गया है, तो है।

इस के साथ

, समस्या का बेहतर बयान, वहाँ दो संभव समाधान इकाई की रूपरेखा का उपयोग करते समय कर रहे हैं।

  1. अपने हटाएँ विधि में, मौजूदा उदाहरण, संपत्तियों की उम्मीद मूल्यों की तुलना, और हटाना अगर वे एक ही कर रहे हैं। इस मामले में, इकाई फ्रेमवर्क एक डेली स्टेटमेंट लिखने का ख्याल रखेगा जिसमें संपत्ति मूल्य शामिल हैं।

  2. एक संग्रहित प्रक्रिया लिखें जो आईडीई और अन्य संपत्ति मान दोनों स्वीकार करती है, और इसे निष्पादित करती है।

+1

यह एक पूरी तरह से वैध लक्ष्य है यदि आपकी ऑब्जेक्ट्स को उनके जीवनकाल के दौरान कभी संशोधित नहीं किया जाता है और/या आपकी क्वेरी को हटाने के लिए वस्तुओं को ढूंढने का अर्थ यह है कि आप जिन गुणों को सत्यापित करेंगे, वे पहले से ही सही मूल्य पर हैं। –

4

एंटिटीकी की पुनः गणना करके एक इकाई को लोड करने का एक तरीका है। यह एक हैक की तरह दिखता है, लेकिन ईएफ में ऐसा करने का एकमात्र तरीका हो सकता है।

ब्लॉग लेख Deleting without Fetching

3
var toDelete = new MyEntityModel{ 
    GUID = guid, 
    //or ID = id, depending on the key 
    }; 
Db.MyEntityModels.Attach(toDelete); 
Db.MyEntityModels.DeleteObject(toDelete); 
Db.SaveChanges(); 

मामले में अपने प्रमुख एकाधिक स्तंभ हैं, आप सभी मान (उदा GUID, columnX, columnY आदि) प्रदान करने के लिए की जरूरत है।

यदि आप कुछ फैंसी महसूस करते हैं तो एक सामान्य कार्य के लिए here देखें।

+0

यह सबसे अच्छा तरीका है (मैं इसे प्लेसहोल्डर ऑब्जेक्ट का उपयोग करके कॉल करता हूं) लेकिन यह नीचे स्टंटज़ द्वारा लाए गए समान समवर्ती चिंताओं से ग्रस्त है। – dansan

3

इकाई फ्रेमवर्क 5 के साथ Entity Framework Extended Library है। NuGet पर उपलब्ध है। फिर आप कुछ लिख सकते हैं जैसे:

context.Users.Delete(u => u.Id == id); 

यह थोक हटावट के लिए भी उपयोगी है।

+0

यह एक अविश्वसनीय पुस्तकालय है! धन्यवाद –

4

आप एक ही आईडी के साथ एक वस्तु बना सकते हैं और यह आसान वस्तुओं के लिए हटाने लेकिन इसकी अच्छा करने के लिए के माध्यम से पारित अगर आप जटिल संबंधों आपको लगता है कि

   var user = new User { ID = 15 }; 
       context.Entry(user).State = EntityState.Deleted; 
       context.SaveChanges();