Quello che voglio fare è semplice. Ho una lista di parti nel db, e voglio cancellarle/inserirle/aggiornarle secondo un elenco di aggiornamento.Entity Framework 5: metodo corretto per sostituire la voce nel contesto
Il problema principale è che, quando voglio sostituire una voce, non posso collegarla al contesto perché la voce precedente (da aggiornare) è già collegata (dalla precedente chiamata letta) e viene generata un'eccezione.
Sono venuto in giro con 3 pensieri.
- manualmente Staccare il vecchio ingresso e collegare quello nuovo (anche se la modifica dello stato entità indipendente getta ancora un'eccezione)
- modificare manualmente i valori della vecchia voce con quelli nuovi
- Effettuare la non chiamata di lettura tracciabile (AsNoTracking()), sembra funzionare bene ma sono preoccupato per l'impatto su lazyloading.
Esiste una funzionalità come "context.entry.replace (oldEntry, newEntry)" o un altro modo corretto per farlo?
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();
Se il contesto sta già monitorando le entità che si desidera eliminare/inserire/aggiornare, perché non eseguire semplicemente le operazioni direttamente su di esse? –