2012-10-02 14 views
8

के साथ इकाई हटाने को ओवरराइड करना मैं DbContext.SaveChanges() विधि को ओवरराइड करके और मेरे ISoftDelete इंटरफ़ेस को लागू करने वाली किसी भी संस्था को हटाने से पूर्ववत करके अपने प्रोजेक्ट में सॉफ्ट सॉफ्ट डिलीवरी सुविधा को कार्यान्वित करने का प्रयास कर रहा हूं।एसोसिएशन

interface ISoftDelete 
{ 
    bool IsDeleted { get; set; } 
} 

SaveChanges() विधि मैं हर प्रविष्टि 'हटाया गया' अवस्था में है और ISoftDelete लागू करता है कि के लिए मेरे SoftDelete() विधि बोल रहा हूँ में:। इस प्रकार

var entries = this.ChangeTracker.Entries().Where(x => (x.State == EntityState.Deleted) && x.Entity is ISoftDelete) 
        .ToList(); 
       entries.ForEach(SoftDelete); 

मेरे SoftDelete() विधि है:

private void SoftDelete(DbEntityEntry entry) 
{ 
    if (entry.State == EntityState.Deleted && entry.Entity is ISoftDelete) 
    { 
     entry.Reload(); 
     var entity = (ISoftDelete)entry.Entity; 
     entity.IsDeleted = true; 
     entry.State = EntityState.Modified; 
    } 
} 

यह पूरी तरह से काम करेगा जब तक कि मैं एक ऐसी इकाई में भाग नहीं लेता जिसके पास किसी और के साथ एक से एक संबंध है।

{"A relationship from the 'ChildParent' AssociationSet is in the 'Deleted' state. Given multiplicity constraints, a corresponding 'Parent' must also in the 'Deleted' state."}

वहाँ एक तरीका है कि इकाई के लिए सभी संघों हो और साथ ही उनके लिए नष्ट कर दिया राज्य को बदलने के लिए है: जो बिंदु पर, एक अपवाद इस त्रुटि के साथ फेंक दिया जाता है?

मैंने पहले से ही वास्तविक संबद्ध इकाई का संदर्भ प्राप्त करने का प्रयास किया है लेकिन इकाई का EntityStateDeleted के बजाय Unchanged पर सेट है।

+3

मुझे लगता है कि एसोसिएशन को स्वयं हटाए जाने के रूप में चिह्नित किया जा रहा है (एसोसिएशन को ईएफ में अलग-अलग वस्तुओं के रूप में माना जाता है) लेकिन संबंधित इकाई नहीं। अब जब ईएफ एसोसिएशन को हटाने की कोशिश करता है तो ऐसा नहीं हो सकता क्योंकि संबंधित इकाई हटाए जाने के लिए चिह्नित नहीं है। मुझे लगता है कि विदेशी कुंजी शून्य नहीं है और इसलिए किसी इकाई को हटाने के लिए संबंधित इकाई को हटाने की आवश्यकता है (कैस्केड डिलीट)। आप इस धागे को देख सकते हैं: http://stackoverflow.com/questions/10300156/ivalidatableobject-is-useless-for-ef-navigation-properties/10304323#10304323। यह सहायक हो सकता है क्योंकि यह दिखाता है कि संबंधित वस्तुओं को कैसे प्राप्त किया जाए। – Pawel

+0

संबंधित वस्तुओं को प्राप्त करने में यह सहायक था, धन्यवाद। हालांकि, रिश्तों में से किसी एक की स्थिति को बदलने की कोशिश करते समय, मुझे एक अजीब त्रुटि मिलती है जो कहती है, "रिश्ते के सिरों में से एक एक कुंजी है," रिश्ते की स्थिति को बदल नहीं सकता है। – Jonathan

+0

क्या आपने [यह कामकाज] देखा है (http://connect.microsoft.com/VisualStudio/feedback/details/513174/unable-to-refresh-some-items-in-the-objectcontext)? –

उत्तर

0

सामान्य रूप से, आपको पहले माता-पिता-संबंधों में बच्चों को नरम हटाने की आवश्यकता होती है। सबसे ऊपर के माता-पिता से शुरू करें, और बच्चों के माध्यम से अपना रास्ता दोबारा शुरू करें। प्रत्येक आइटम का दौरा चिह्नित करें, ताकि आप ट्रैक कर सकें कि यह पहले से ही नरम हटा दिया गया है (पीछे संदर्भों के मामले में)।

यदि आपके पास "व्यावसायिक वस्तु" अवधारणा है, तो आप नेविगेशन की आसानी के लिए Childs और Parent गुण जोड़ सकते हैं। अन्यथा आपको प्रत्येक माता-पिता पर गैर-छोटे बाल संबंधों के साथ "हाथ-कोड" करना होगा।

यह भी ध्यान दें कि एक LINQ कथन का उपयोग करके आपके पास वास्तविक ट्रैवर्सिंग पर कोई नियंत्रण नहीं है।

मुझे पता है कि उपर्युक्त काम बहुत सारे काम की तरह लगता है, लेकिन इस बात पर विचार करें कि आप ईएफ में एक तंत्र को कैसे डिवाइस करेंगे जो स्वचालित रूप से आवश्यक रिश्ते की जानकारी का अनुमान लगाएगा ?! आप इस तरह की चीजें ठीक से खत्म कर देंगे।

संबंधित मुद्दे