2012-01-25 19 views
12

पर इकाई फ्रेमवर्क मुझे इकाई फ्रेमवर्क 4.1 में संबंधित पंक्तियों को हटाने में समस्या है।हटाए गए कैस्केड

ALTER TABLE [dbo].[BookFormats] WITH CHECK ADD CONSTRAINT [FK_BookFormats_Book] 
FOREIGN KEY([BookID]) REFERENCES [dbo].[Book] ([BookID]) on delete cascade 

edmx संपत्ति

enter image description here

तो: मैं संबंधों

पुस्तक 1 ​​< ---> * BookFormats

मैं नष्ट झरना पर स्थापित किया है के साथ टेबल है , मैं अपने Book ऑब्जेक्ट से संबंधित सभी BokFormats आइटमों को हटाना चाहता हूं:

var originalBook = m.db.Book.First(x => x.BookID == bookId); 
originalBook.BookFormats.Clear(); 
m.db.SaveChanges(); 

लेकिन, मुझे त्रुटि मिलती है:

The operation failed: The relationship could not be changed because one or more of the foreign-key properties is non-nullable. When a change is made to a relationship, the related foreign-key property is set to a null value. If the foreign-key does not support null values, a new relationship must be defined, the foreign-key property must be assigned another non-null value, or the unrelated object must be deleted.

मैं कैसे इन वस्तुओं को हटाने के लिए पर विचारों से बाहर भाग गया। कोई विचार?

उत्तर

10

कास्केड विलोपन अवधारणा इस प्रकार है:

जब आप डीबी से Book हटाना सभी संबंधित BookFormats एसक्यूएल सर्वर द्वारा आप के लिए हटा दिया जाएगा (कृपया ध्यान दें यह कोई बात नहीं है कि कैसे Book का विलोपन के माध्यम से शुरू किया जाएगा ईएफ या कच्चे एसक्यूएल)। इस प्रकार इसका आपके कार्य से कोई लेना-देना नहीं है: "मैं अपने Book से संबंधित सभी BookFormats को हटाना चाहता हूं"। आप RemoveRange उपयोग कर सकते हैं

foreach(var m in m.db.BookFormats.Where(f=>f.BookID == bookID)) 
{ 
    m.db.BookFormats.Remove(m); 
} 
m.db.SaveChanges(); 
4

आप डेटाबेस से BookFormats हटा रहे हैं, लेकिन आप संबंध हटा रहे हैं, इस प्रकार आपके BookFormats orpahning और शून्य करने के लिए BookID सेटिंग कॉलम। डेटाबेस पर डाले गए डिलीट कैस्केड का कहना है कि When I delete the पुस्तक , then delete all of the बुकफॉर्मैट्स that have a बुकआईडी equal to mine. आप Book से प्रारूपों को हटा रहे पुस्तक को हटा नहीं रहे हैं।

के बजाय originalBook.BookFormats.Clear() आप कुछ इस तरह होना चाहिए ...

List<int> idsToDelete = new List<int>(); 

foreach (BookFormat bf in originalBook.BookFormats) 
{ 
    idsToDelete.Add(bf.ID); 
} 

foreach (int id in idsToDelete) 
{ 
    BookFormat format = m.db.BookFormat.FirstOrDefault(x => x.ID == id); 
    if (format != null) 
    { 
     m.db.DeleteBookFormat(format); 
    } 
} 

m.db.SaveChanges(); 

यह उन पंक्तियों के साथ कुछ किया जाना चाहिए। ईडीएमएक्स में ईएफएफ डिलीट विधि कैसे बनाता है, यह याद रखने के लिए मेरे पास यह सही नहीं है।

+0

तो मैं त्रुटि मिलती है: संग्रह संशोधित किया गया था; गणना ऑपरेशन निष्पादित नहीं हो सकता है। – Tony

+0

@ टोनी, कोड में परिवर्तन की जांच करें। सबसे सुंदर तरीका नहीं है, लेकिन काम पूरा हो जाता है। – bdparrish

14

: यह पूरा करने के लिए आप कुछ इस तरह की जरूरत है

m.db.BookFormats.RemoveRange(originalBook.BookFormats); 
m.db.SaveChanges(); 

लेकिन यह मैं EF6 उपयोग करें और यह काम करता है एफई 6.0

+1

हाँ। यह RemoveRange पर उदाहरण है।लेकिन कुछ लोगों को भ्रमित करने के लिए मैं पोस्ट संपादित करूंगा। धन्यवाद। – Saykor

0

के लिए है।

 var itemBinding = db.ItemBinding.Where(x => x.BindingToId == id) ; 
     foreach (var ib in itemBinding) 
     { 
      db.Item.Remove(ib.Item); 
      db.ItemBinding.Remove(ib); 
     } 
     db.SaveChanges(); 
+0

ईएफ 7 जारी नहीं किया गया है। ईएफ 6.1 नवीनतम स्थिर संस्करण है। – MEMark

0

मैं एफई 6.1.3 में यह परीक्षण किया है और यह ठीक काम करना चाहिए: अच्छी तरह से

var originalBook = m.db.Book.First(x => x.BookID == bookId); 
originalBook.BookFormats.Clear(); 
db.Books.Remove(originalBook); 
m.db.SaveChanges(); 
संबंधित मुद्दे