Come scollegare innanzitutto gli oggetti nel codice di Entity Framework?


Risposte:


156

Se vuoi staccare un oggetto esistente, segui i consigli di @ Slauma. Se si desidera caricare oggetti senza tenere traccia delle modifiche, utilizzare:

var data = context.MyEntities.AsNoTracking().Where(...).ToList();

Come menzionato nel commento, questo non distaccerà completamente le entità. Sono ancora collegati e il caricamento lento funziona ma le entità non vengono monitorate. Questo dovrebbe essere usato per esempio se vuoi caricare un'entità solo per leggere i dati e non prevedi di modificarli.


3
@Ladislav: Questo è probabilmente il significato del programmatore di Lol. Non ho mai usato e pensato a questo metodo anche se carico spesso elenchi di oggetti e dispongo il contesto in una volta, qualcosa del genere using(ctx){ return ctx....ToList(); }. In questi casi l'uso AsNoTracking()avrebbe molto senso perché risparmierei di riempire inutilmente il contesto dell'oggetto. Immagino che probabilmente avrebbe un vantaggio in termini di prestazioni e consumo di memoria soprattutto per elenchi di grandi dimensioni, giusto?
Slauma,

1
@Slauma: Sì, ha un vantaggio in termini di prestazioni. Questo è il motivo per cui esiste questo metodo. L'uso di questo approccio nell'API ObjectContext è un po 'più complicato.
Ladislav Mrnka,

2
Questo disabilita il caricamento lento?
Shawn Mclean,

3
In realtà ciò non disabiliterà il caricamento lento, ma disabiliterà solo il rilevamento delle modifiche e migliorerà le prestazioni = l'entità è ancora collegata. L'ho trovato dopo aver risposto a questa domanda, quindi dovresti contrassegnare quella di @ Slauma come una risposta valida.
Ladislav Mrnka,

1
Questo è quello che voglio. Voglio un caricamento lento e la possibilità di modificare solo un'entità staccata.
Shawn Mclean,

255

Questa è un'opzione:

dbContext.Entry(entity).State = EntityState.Detached;

3
Posso farlo quando recupero oggetti che restituiscono un IQueryable?
Shawn Mclean,

1
@Lol coder: non sono sicuro di aver capito bene, ma entitydevo essere un oggetto materializzato di un tipo che fa parte delle classi del tuo modello (Persona, Cliente, Ordine, ecc.). Non è possibile passare direttamente in un IQueryable <T> in dbContext.Entry(...). È questa la domanda che intendevi?
Slauma,

9
@EladBenda: dipende. Se si desidera staccare un oggetto che è già collegato al contesto, impostare lo stato su Detached. Se si desidera caricare entità dal DB senza collegarle affatto al contesto (nessun rilevamento delle modifiche), utilizzare AsNoTracking.
Slauma,

1
Ho trovato un problema interessante con questo metodo. Anche se l'entità può essere una classe proxy, il caricamento lento non funzionerà dopo aver cambiato il suo stato in Detached.
kjbartel,

4
@kjbartel: questo è il comportamento previsto, poiché l'entità non ha alcun collegamento con il contesto.
Ricardo Souza,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.