http://weblogs.asp.net/zeeshanhirani/archive/2010/07/23/removing-entity-from-a-related-collection.aspx बताते हैं कि वास्तव में क्या हुआ आपको अंदर context.DeleteObject(recipe)
जोड़ें।
मान लिया जाये कि आप इस तरह से एक वर्ग डिजाइन कुछ है:
इकाई की रूपरेखा के लिए आवश्यक विदेशी कुंजी कॉलम पैदा करते हैं और उन्हें NOT NULL
की कमी जोड़ने क्योंकि सभी व्यंजनों हमेशा बिल्कुल साथ संबद्ध किया जाएगा होगा एक नियंत्रण यूनिट।
तो रनटाइम पर आप निम्नलिखित लेआउट के लिए इसी तरह की वस्तुओं होगा:
अब आप अपने कोड खेलने में आता है और पकाने की विधि के बीच संबंध वस्तुओं और उनके ControlUnit नष्ट कर दिया:
इस समय को बचाने के लिए कोशिश कर रहा है, डेटाबेस विदेशी कुंजी NOT NULL
स्तंभ में डाल करने के लिए एक ControlUnit आईडी नहीं है। वर्तमान ऑब्जेक्ट स्टेट उपरोक्त वर्ग आरेख का उल्लंघन करता है और इसे डेटाबेस लेआउट में सहेजा नहीं जा सकता है जो इस धारणा के तहत उत्पन्न किया गया है कि प्रत्येक पकाने की विधि एक ControlUnit से जुड़ी है। यही कारण है कि डेटाबेस परिवर्तनों को सहेजने से इंकार कर देता है और आप अपवाद देखते हैं।
यह भी बताता है कि जब आप इकाई को हटाने वाली रेखा को अनदेखा करते हैं तो यह क्यों काम करता है: इकाई को इसके रिश्ते के साथ डेटाबेस से हटा दिया जाता है, इसलिए कोई बाधाओं का उल्लंघन नहीं होता है, इसलिए कोई अपवाद नहीं है।
"लेकिन मैं रिश्ते पर ON DELETE CASCADE
सेट ..."
हाँ, पर है कि केवल वस्तु का विलोपन पर शुरू हो रहा है, रिश्ते का विलोपन पर नहीं।ON DELETE CASCADE
सेट के साथ, इस काम करना चाहिए:
:
controlUnitRepository.DeleteObject(_controlUnit);
// deletes the ControlUnit and all associated Recipe entities
आप ControlUnit के साथ अपने संबंधों का विलोपन पर पकाने की विधि संस्थाओं का विलोपन को गति प्रदान करना चाहते हैं, अपने रिश्ते एक सरल संघ बल्कि एक रचना नहीं होना चाहिए
ईएफ इस मूल रूप से समर्थन नहीं करता है, लेकिन आप संबंधों की पहचान करके व्यवहार का अनुकरण कर सकते हैं। एक बार एक इकाई एक मूल इकाई के लिए एक पहचान संबंध में है और वह रिश्ते हटा दिया गया है, तो इकाई भी हटा दी गई है। ऐसा लगता है कि यह शुरुआत से आपका इरादा था। रिश्ते की पहचान करने के बारे में अधिक जानकारी के लिए, Implementing identifying relationships with EF4 देखें जहां मैंने ईएफ 4 के साथ संबंधों को पहचानने और अधिक पढ़ने वाली सामग्री से जुड़े हुए हैं।
public static void Delete<T>(this EntityCollection<T> collection, T entityToDelete) where T : EntityObject, IEntityWithRelationships
{
RelationshipManager relationshipManager = entityToDelete.RelationshipManager;
IRelatedEnd relatedEnd = relationshipManager.GetAllRelatedEnds().FirstOrDefault();
if (relatedEnd == null)
{
throw new Exception("No relationships found for the entity to delete. Entity must have at least one relationship.");
}
var query = relatedEnd.CreateSourceQuery() as ObjectQuery;
if (query == null)
{
throw new Exception("The entity to delete is detached. Entity must be attached to an ObjectContext.");
}
query.Context.DeleteObject(entityToDelete);
collection.Remove(entityToDelete);
}
तो मैं तो Order.Products.Delete(prod)
की तरह एक इकाई को हटा दें:
मैं आज एक ही समस्या थी देखें और मेरा मानना है कि इस इकाई की रूपरेखा में एक डिजाइन दोष है। SQL सर्वर में तालिकाओं के बीच संबंध "कैस्केड डिलीट अनाथ" बताता है और इसलिए काम करना चाहिए। यह एनएचबेर्नेट में ऐसा काम करता है। सौभाग्य से आप इसे ग्रीममिलर के उत्तर और संबंधित प्रश्नों के बाद काम करने के लिए प्राप्त कर सकते हैं। –