2013-01-23 17 views
9

मैं जो करना चाहता हूं वह सरल है। मेरे पास डीबी में भागों की एक सूची है, और मैं उन्हें अद्यतन सूची के अनुसार हटा/डालने/अपडेट करना चाहता हूं।इकाई फ्रेमवर्क 5: संदर्भ में प्रविष्टि को प्रतिस्थापित करने के लिए उचित विधि

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

मैं 3 विचारों के साथ आया था।

  1. मैन्युअल अलग करें पुराने प्रवेश और नया देते हैं (हालांकि अलग करने के लिए इकाई राज्य बदल रहा है अभी भी फेंकता अपवाद)
  2. मैन्युअल नए लोगों के साथ पुरानी प्रविष्टि के मूल्यों को बदल
  3. पढ़ने कॉल गैर बनाओ ट्रैक सक्षम (AsNoTracking()), यह ठीक काम करता प्रतीत होता है लेकिन मैं lazyloading पर प्रभाव के बारे में चिंतित हूँ।

क्या कोई कार्यक्षमता "context.entry.replace (oldEntry, newEntry)" या ऐसा करने का कोई अन्य उचित तरीका है?

IEnumerable<SoldPart> old = db.SoldParts.Where(sp=>sp.sessionId == sessionId); 

       var toDelete = old.Where(po=> !parts.Any(pu=>pu.id == po.id)); 
       var toCreate = parts.Where(po => !old.Any(pu => pu.id == po.id)); 
       var toUpdate = parts.Where(po => old.Any(pu => pu.id == po.id)); 


       foreach (SoldPart item in toDelete) 
       { 
        db.SoldParts.Attach(item); 
        db.SoldParts.Remove(item); 
       } 
       foreach (SoldPart item in toCreate) 
       { 
        db.SoldParts.Add(item); 
       } 

       foreach (SoldPart item in toUpdate) 
       { 

        db.SoldParts.Attach(item); 
        db.Entry(item).State = EntityState.Modified; 
       } 


       db.SaveChanges(); 
+0

यदि आपका संदर्भ पहले से ही उन इकाइयों को ट्रैक कर रहा है जिन्हें आप हटाना/डालना/अपडेट करना चाहते हैं तो क्यों न केवल उन पर संचालन करें? –

उत्तर

28

संलग्न इकाई के मूल्यों को अलग से अपडेट करने का स्वचालित तरीका है लेकिन यह केवल स्केलर/जटिल गुणों पर काम करता है। नेविगेशन गुणों पर नहीं:

deb.Entry(oldEntry).CurrentValues.SetValues(newEntry); 
+0

@drunkcamel: क्या आप समझा सकते हैं? इकाई में पीके होना चाहिए, अन्यथा यह एक इकाई नहीं है। –

+0

मुझे खेद है, मैंने कोशिश की और अपवाद मिला एक संपत्ति इकाई कुंजी का एक हिस्सा है और असाइन नहीं किया जा सकता है। लेकिन अब मैंने इसे पुन: उत्पन्न करने की कोशिश की और मैं नहीं कर सका। – drunkcamel

+0

@drunkcamel: यह शायद सबसे अधिक था क्योंकि 'oldEntry' और' newEntry' के पास इकाई कुंजी का अलग-अलग मान था। यह संभव है कि यह विफल हो क्योंकि आप मौजूदा इकाई की कुंजी नहीं बदल सकते हैं। –