Come faccio ad aggiornare gli oggetti Entity Framework senza cambiare tutte le istanze di tale oggetto?
-
26-10-2019 - |
Domanda
Ho questo codice che utilizza Entity Framework 4.1 per accedere entità del database:
public string Test()
{
Navigation nav = db.Navigations.FirstOrDefault();
List<Navigation> lNav = db.Navigations.ToList();
foreach (var item in lNav)
{
item.Label += " [Edited]";
}
return nav.Label;
}
Quando ho eseguito questo in asp.net mvc restituisce questo:
News [Edited]
I aspettava di tornare:
News
Perché ho pensato che la mia foreach
sarebbe solo modificare il contenuto del lNav
. Invece, sembra di modificare tutte le istanze degli oggetti entità.
Come posso modificare lNav
senza modificare anche nav
?
Soluzione
Prova AsNoTracking()
:
Navigation nav = db.Navigations.AsNoTracking().FirstOrDefault();
List<Navigation> lNav = db.Navigations.AsNoTracking().ToList();
In questo modo gli enti caricato non sono attaccati al contesto e due istanze diverse deve essere creato per la prima entità. Utilizzando AsNoTracking
si disattiva il mapping identità tra i valori fondamentali di un'entità e riferimenti a oggetti che è responsabile per il comportamento osservato. (Non ci può sempre essere solo un riferimento di entità con una data chiave nel contesto e EF non crea un nuovo oggetto se si carica un'entità con la stessa chiave. Invece si restituisce l'oggetto che già esiste nel contesto.)
Si tenga presente che non è possibile utilizzare questo se l'intenzione di entità aggiornamento con l'aiuto di EF il rilevamento delle modifiche meccanismo. AsNoTracking()
è progettato per gli scenari di sola lettura.