2010-01-13 12 views
25

मैंने एंटिटी फ्रेमवर्क के साथ एक रोचक समस्या में भाग लिया है और मुझे उस कोड के आधार पर उपयोग करने के लिए उपयोग किया गया था, मुझे संदेह है कि मेरा समाधान आदर्श से कम है। मेरे पास टेबल ए और टेबल बी के बीच 1 से कई रिश्तों हैं जहां टेबलबी में इकाइयों के पास टेबलए का संदर्भ है। मैं एक परिदृश्य में जहाँ मैं एक साथ TableA में एक पंक्ति के सभी बच्चों को हटाना चाहते हैं और मुझे लगा कि यह बस उस समूह का साफ़ करके प्राप्त किया जा सकता है:इकाई फ्रेमवर्क - एक बाल संग्रह साफ़ करें

Entity.Children.Clear() 

दुर्भाग्य से, जब मैं परिवर्तन इस एक विदेशी के रूप में उत्पादित बचाने का प्रयास किया मुख्य उल्लंघन।

एक रिश्ता जोड़ा जा रहा है या एक AssociationSet 'FK_EntityB_EntityA' से हटा दिया। कार्डिनिटी बाधाओं के साथ, संबंधित 'EntityB' को भी जोड़ा या हटाया जाना चाहिए।

जिस समाधान के साथ मैं आया था वह मैन्युअल रूप से इकाई संदर्भ के DeleteObject() के माध्यम से ऑब्जेक्ट को हटाना था, लेकिन मुझे पता है कि मैं इस तर्क का उपयोग कर रहा हूं, गलत है।

while (collection.Any()) 
    Entities.DeleteObject(collection.First()); 

एक के लिए, तथ्य यह है कि मैं एक कहाँ() पाश का इस्तेमाल किया था अब तक आदर्श से कम लगता है, लेकिन मुझे लगता है कि विशुद्ध रूप से मेरी ओर से एक अर्थ आकलन है। किसी भी मामले में, क्या मैं ऐसा कर रहा हूं, इसमें कुछ गड़बड़ है, या क्या किसी इकाई की बाल इकाई संग्रह को साफ़ करने का शायद एक बेहतर तरीका है कि एंटीटी फ्रेमवर्क सभी हटाए गए ऑब्जेक्ट्स पर डेटा स्टोर को ठीक से हटा देता है?

उत्तर

20

Clear() इकाई को संदर्भ हटा देता है, न कि इकाई के।

आप चाहते हैं तो इस हमेशा एक ही आपरेशन होने के लिए आपको AssociationChanged संभाल सकता:

Entity.Children.AssociationChanged += 
    new CollectionChangeEventHandler(EntityChildrenChanged); 
Entity.Children.Clear();    

    private void EntityChildrenChanged(object sender, 
     CollectionChangeEventArgs e) 
    { 
     // Check for a related reference being removed. 
     if (e.Action == CollectionChangeAction.Remove) 
     { 
      Context.DeleteObject(e.Element); 
     } 
    } 

आप एक आंशिक वर्ग का उपयोग कर अपने संस्था के लिए में इस निर्माण कर सकते हैं।

+0

यह सही दिखता है। आंशिक वर्ग से संदर्भ में कोई प्रत्यक्ष (या अप्रत्यक्ष) मार्ग है? –

+1

हाँ एक अप्रत्यक्ष मार्ग है: http: //blogs.msdn।com/alexj/archive/2009/06/08/tip-24-how-to-get-the-objectcontext-from-an-entity.aspx –

+0

ऐसा लगता है कि मैं बस थोड़ी देर के निर्माण() लूप को बेहतर बनाने में बेहतर हूं मेरे भंडार में हटाना ताकि मैं इसे आसानी से पुन: उपयोग कर सकूं। मुझे संदर्भ को हल करने की चेतावनी के बारे में चिंता करने की ज़रूरत नहीं है और यह उपयुक्त रूप से लचीला है। फिर भी, मुझे कुछ समय के लिए सी # में थोड़ी देर() लूप लिखना नहीं था, यह लगभग गलत लगता है। –

5

आप माता-पिता और शिशु संस्थाओं के बीच संबंध पहचानना बना सकते हैं और ईएफ अभिभावक के संग्रह से इसे हटाते समय बाल इकाई को हटा देगा।

public class Parent 
    { 
     public int ParentId {get;set;} 
     public ICollection<Child> Children {get;set;} 
    } 

    public class Child 
    {   
     public int ChildId {get;set;} 
     public int ParentId {get;set;} 
    } 

मानचित्रण विन्यास:

modelBuilder.Entity<Child>().HasKey(x => new { x.ChildId, x.ParentId }); 
    modelBuilder.Entity<Parent>().HasMany(x => x.Children).WithRequired().HasForeignKey(x => x.ParentId); 
5

चाल: जब जनक एवं बाल के बीच संबंध स्थापित करने, आप बच्चे पर एक "समग्र" कुंजी बनाना होगा। इस तरह, जब आप माता-पिता को 1 या उसके सभी बच्चों को हटाने के लिए कहते हैं, तो संबंधित रिकॉर्ड वास्तव में डेटाबेस से हटा दिए जाएंगे। तब

modelBuilder.Entity<Child>().HasKey(t => new { t.ParentId, t.ChildId }); 

, संबंधित बच्चों को हटाने के लिए:

Fluent एपीआई का उपयोग कर समग्र कुंजी कॉन्फ़िगर करने के लिए

var parent = _context.Parents.SingleOrDefault(p => p.ParentId == parentId); 

var childToRemove = parent.Children.First(); // Change the logic 
parent.Children.Remove(childToRemove); 

// you can delete all children if you want 
// parent.Children.Clear(); 

_context.SaveChanges(); 

हो गया!

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