2013-06-27 14 views
5

मैं थोड़ी देर के लिए खोज कर रहा हूं और कुछ भी नहीं जो मुझे काम मिल सकता है। मेरे पास एक ऐसी स्थिति है जहां मेरे पास दो वस्तुएं हैं (नीचे परिभाषा देखें)। बाल वस्तु माता-पिता पर एक संग्रह है। मैं WPF/प्रिज्म और इकाई की रूपरेखा के साथ दृश्य स्टूडियो 2012 में काम कर रहा हूँ 4,4इकाई फ्रेमवर्क 4.4, बाल संग्रह वस्तुओं को पुनः लोड करना

class Parent 
{ 
    ...other properties... 
    public virtual ICollection<Child> Children { get; set; } 
} 

class Child 
{ 
    public string Value1 { get; set } 
    public string Value2 { get; set } 
    public string Value3 { get; set } 
} 

मैं एक फार्म बाएं हाथ की ओर एक सूची बॉक्स में जनक लोड हो रहा है और में आइटम में से एक पर उपयोगकर्ता क्लिक करता है है सूची और हम दाएं हाथ की संपत्तियों को दिखाते हैं। सबकुछ बढ़िया काम करता है जब तक कि हमारे पास एक ही डेटाबेस को मारने वाली दो मशीनें होती हैं। यदि एक मशीन रिकॉर्ड में से किसी एक को जोड़ती है या अपडेट करती है, तो मुझे दूसरी मशीन के साथ डेटा मिल रहा है ...

मेरे पास निम्न कोड है और इसे ठीक करने के लिए निम्न कोड है, लेकिन ऐसा लगता है कि एक आसान तरीका होना चाहिए इकाई ढांचे के भीतर।

DbEntityEntry<Parent> entry = dbContext.Entry(parent); 
entry.Reload(); //Note: this refreshes the properties on the Parent object (but not the collection 

if (Parent.Children != null) 
{ 
    Array a = doc.Children.ToArray<Child>(); //this is here because they may have deleted one of the records 

    foreach (Child g in a) 
    { 
     DbEntityEntry<Child> c= dbContext.Entry(g); 
     c.Reload(); //Note: if it is deleted, the Parent.Child gets updated automatically to remove the record. 
    } 
} 

entry.Collection(o => o.Children).Load(); //call this to get new records 

कोई विचार जो मैं बेहतर कर सकता हूं या यह करने का तरीका है ?????

+0

+1 क्योंकि मुझे यह एक अच्छा समाधान मिल रहा है (और मैंने सीखा कि 'रीलोड' बाल संग्रह से हटाए गए इकाइयों को हटा देता है)। मुझे संदेह है कि आप इसे एक साधारण एक-लाइनर में या तो संपीड़ित कर सकते हैं। ऑब्जेक्ट ग्राफ़ को अपडेट/रीफ्रेश करना ईएफ के साथ शायद ही कभी आसान है। – Slauma

+0

मेरे समाधान के साथ मेरे पास एक मुद्दा यह है कि मेरे वास्तविक कोड में, मेरे पास 4-5 प्रकार के संग्रह हैं। ऐसा लगता है कि पहले रीलोड को सभी बाल संग्रहों को पुनः लोड करना चाहिए, या कम से कम ntry.Collection (o => o.Children)। लोड(); ' इस प्रविष्टियां निकाल; शायद एक" पुनः लोड करें "होना चाहिए बजाय – adondero

+1

foreach ऊपर सरणी पर ' ((IObjectContextAdapter) dbContext) .ObjectContext.Refresh (RefreshMode.StoreWins, parent.Children) करने के लिए एक बेहतर रास्ता मिल गया और वर्तमान अद्यतन अद्यतन। नए रिकॉर्ड प्राप्त करने के लिए अभी भी लोड() की आवश्यकता है। यह भी बहुत तेज़ लगता है। – adondero

उत्तर

12

एक जवाब को यह ले जाया गया

"foreach" ऊपर सरणी

((IObjectContextAdapter)dbContext).ObjectContext.Refresh(RefreshMode.StoreWins, parent.Children); 

इस प्रविष्टियां निकाल दी और मौजूदा वाले अद्यतन करता है पर करने के लिए एक बेहतर रास्ता मिल गया। नए रिकॉर्ड प्राप्त करने के लिए अभी भी लोड() की आवश्यकता है। यह भी बहुत तेज़ लगता है

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