2013-01-23 8 views
9

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.

  1. manualmente Staccare il vecchio ingresso e collegare quello nuovo (anche se la modifica dello stato entità indipendente getta ancora un'eccezione)
  2. modificare manualmente i valori della vecchia voce con quelli nuovi
  3. 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(); 
+0

Se il contesto sta già monitorando le entità che si desidera eliminare/inserire/aggiornare, perché non eseguire semplicemente le operazioni direttamente su di esse? –

risposta

28

C'è un modo automatico per aggiornare i valori dell'entità allegata da uno scollegato ma funziona solo su proprietà scalari/complesse. Non nelle proprietà di navigazione:

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

@ drunkcamel: Puoi spiegare? L'entità deve avere PK, altrimenti non è un'entità. –

+0

Mi dispiace, l'ho provato e ho ottenuto un'eccezione: una proprietà è una parte della chiave dell'entità e non può essere assegnata. Ma ora ho provato a riprodurlo e non potevo. – drunkcamel

+0

@ drunkcamel: Probabilmente era dovuto al fatto che 'oldEntry' e' newEntry' avevano un valore diverso della chiave dell'entità. È possibile che non riesca perché non è possibile modificare una chiave dell'entità esistente. –

Problemi correlati