Come faccio ad aggiornare gli oggetti Entity Framework senza cambiare tutte le istanze di tale oggetto?

StackOverflow https://stackoverflow.com/questions/7810989

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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top