मैं जो करना चाहता हूं वह सरल है। मेरे पास डीबी में भागों की एक सूची है, और मैं उन्हें अद्यतन सूची के अनुसार हटा/डालने/अपडेट करना चाहता हूं।इकाई फ्रेमवर्क 5: संदर्भ में प्रविष्टि को प्रतिस्थापित करने के लिए उचित विधि
मुख्य मुद्दा यह है कि, जब मैं किसी प्रविष्टि को प्रतिस्थापित करना चाहता हूं तो मैं इसे संदर्भ में संलग्न नहीं कर सकता क्योंकि पुराना (अपडेट किया जाना) प्रविष्टि पहले ही संलग्न है (पिछले पढ़ने के कॉल द्वारा) और एक अपवाद फेंक दिया गया है।
मैं 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();
यदि आपका संदर्भ पहले से ही उन इकाइयों को ट्रैक कर रहा है जिन्हें आप हटाना/डालना/अपडेट करना चाहते हैं तो क्यों न केवल उन पर संचालन करें? –