2010-03-18 5 views
64

मुझे ऐसा लगता है मैं एक वस्तु पुनः प्राप्त करने से पहले मैं की तरह नीचेकैसे इकाई ढांचे के साथ आईडी द्वारा किसी वस्तु को नष्ट करने के

var customer = context.Customers.First(c => c.Id = 1); 

context.DeleteObject(customer); 

context.Savechanges(); 

तो मैं डेटाबेस दो बार हिट करने के लिए की जरूरत है इकाई ढांचे के साथ इसे हटा है। क्या कोई आसान तरीका है?

+0

http://j.mp/f0x0Bh अपने जवाब है। यह – BritishDeveloper

उत्तर

0

यदि आप ईएफ 1.0 का उपयोग कर रहे हैं, तो यह करने का सबसे संक्षिप्त तरीका है। अन्य तरीके हो सकते हैं लेकिन वे IMHO के लायक होने की तुलना में अधिक परेशानी हैं।

20

यदि आप इसके लिए क्वेरी नहीं करना चाहते हैं तो बस एक इकाई बनाएं, और फिर इसे हटा दें।

Customer customer = new Customer() { Id = 1 } ; 
context.AttachTo("Customers", customer); 
context.DeleteObject(customer); 
context.Savechanges(); 
44

एक छोटा सा परिवर्तन के साथ @Nix रूप में एक ही दृढ़ता से लिखा जाता है:

आप यह सिर्फ एक इकाई बनाने के लिए क्वेरी करने के लिए नहीं करना चाहते हैं, और फिर इसे हटा दें।

   Customer customer = new Customer() { Id = id }; 
       context.Customers.Attach(customer); 
       context.Customers.DeleteObject(customer); 
       context.SaveChanges(); 
+4

करने का एक अच्छा और सामान्य तरीका है क्योंकि ऑब्जेक्ट गुम होने पर यह अपवाद फेंकता है: "DbUpdateConcurrencyException: पंक्तियों की एक अप्रत्याशित संख्या प्रभावित करने वाले स्टेटमेंट को अपडेट, डालने या हटाएं।" मैं इसे अनदेखा करना चाहता हूं, जैसे एक डिलीट स्टेटमेंट होगा। – Dunc

+0

क्षमा करें, यह सत्यापन का कारण बनता है जिसकी आवश्यकता नहीं है और हमेशा की उम्मीद है! –

20

इसी तरह के प्रश्न here

इकाई फ्रेमवर्क के साथ EntityFramework-Plus (एक्सटेंशन लाइब्रेरी) है।
NuGet पर उपलब्ध है। फिर आप कुछ लिख सकते हैं जैसे:

// DELETE all users which has been inactive for 2 years 
ctx.Users.Where(x => x.LastLoginDate < DateTime.Now.AddYears(-2)) 
    .Delete(); 

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

+18

यह कारण बताता है कि यह अब तक मूल ईएफ लाइब्रेरी का हिस्सा नहीं है। – nathanchere

+1

@ फेरेटेलिका - सहमत हुए। – acarlon

+1

यह विधि अप्रचलित उपयोग है: संदर्भ। उपयोगकर्ता। जहां (उपयोगकर्ता => उपयोगकर्ता.आईडी == आईडी)। हटाएं(); – Manuel

4

कच्चे एसक्यूएल क्वेरी मैं

public void DeleteCustomer(int id) 
{ 
    using (var context = new Context()) 
    { 
     const string query = "DELETE FROM [dbo].[Customers] WHERE [id]={0}"; 
     var rows = context.Database.ExecuteSqlCommand(query,id); 
     // rows >= 1 - count of deleted rows, 
     // rows = 0 - nothing to delete. 
    } 
} 
+5

यह ईएफ में दृढ़ता से टाइप ऑब्जेक्ट funtionality का उपयोग करने के उद्देश्य को हरा देता है। – LawMan

+0

यह ईएफ पहचान नकद समझौता करता है। इस ईएफ के बाद भी आपकी हटाई गई इकाई वापस आ जाएगी। – epox

+1

यह Azure SQL डेटावेयर के साथ काम करता है, जब अन्य समाधान नहीं करते हैं। –

39

लगता इकाई की रूपरेखा 6 हटाएं क्रिया Remove है में सबसे तेज़ तरीका है।

using (var _context = new DBContext(new DbContextOptions<DBContext>())) 
    { 
     try 
     { 
      _context.MyItems.Remove(new MyItem() { MyItemId = id }); 
      await _context.SaveChangesAsync(); 
     } 
     catch (Exception ex) 
     { 
      if (!_context.MyItems.Any(i => i.MyItemId == id)) 
      { 
       return NotFound(); 
      } 
      else 
      { 
       throw ex; 
      } 
     } 
    } 

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

Customer customer = new Customer() { Id = id }; 
context.Customers.Attach(customer); 
context.Customers.Remove(customer); 
context.SaveChanges(); 
+0

यह मेरे लिए काम किया –

2

मैं अपनी परियोजनाओं में से एक में निम्न कोड का उपयोग कर रहा है निर्दिष्ट आईडी के साथ। फिर यदि आइटम नहीं मिला है, तो यह एक सार्थक संदेश देता है; अन्यथा, यह केवल अपवाद को फेंक देता है (आप अलग-अलग अपवाद प्रकारों के लिए अलग-अलग पकड़ ब्लॉक का उपयोग करके अपने मामले में अधिक फिट बैठ सकते हैं, ब्लॉक आदि का उपयोग करके अधिक कस्टम चेक जोड़ सकते हैं)।

[मैं इकाई की रूपरेखा कोर के साथ एक MVC नेट कोर/नेट कोर परियोजना में इस कोड का उपयोग कर रहा हूँ।]