Ottieni l'elenco degli oggetti modificati all'interno di Entity Framework 7

.net c# dbcontext entity-framework entity-framework-core

Domanda

Sono perplesso: l'aggiornamento a Entity Framework 7 e in genere sovrascrivo le SaveChanges all'interno di DbContext per poter ottenere un elenco di tutti gli oggetti modificati prima che cambi. Alla fine ho uno script che spara che tiene traccia della versione precedente in un database. In Entity Framework 6 otterrei i cambiamenti del modello in questo modo:

var oc = ((IObjectContextAdapter)this).ObjectContext;
var modifiedItems = oc.ObjectStateManager.GetObjectStateEntries(EntityState.Modified | EntityState.Deleted);

List<ObjectStateEntry> ModifiedObjlist = modifiedItems.ToList();

Tuttavia, ora che ObjectContext è stato rimosso all'interno di Entity Framework 7, sono bloccato, in che modo all'interno di Entity Framework 7 è possibile ottenere un elenco degli oggetti modificati?

Risposta accettata

È possibile utilizzare DbContext.ChangeTracker

var modifiedEntries = context.ChangeTracker
       .Entries()
       .Where(x => x.State == EntityState.Modified)
       .Select(x =>x.Entity)
       .ToList();

Risposta popolare

Il codice di @dotctor potrebbe non funzionare in alcuni casi.

Ci sono alcuni casi in cui il tracker delle modifiche potrebbe non avere le informazioni più recenti riguardo alle entità gestite dal contesto, quindi un'entità potrebbe essere modificata / aggiunta / cancellata senza che il tracker delle modifiche sia consapevole. Per evitare questo caso, vorrei avvolgere il codice di @dotctor nel seguente condizionale:

if(context.ChangeTracker.HasChanges())
{
  ...
}


Riepilogo Microsoft di ChangeTracker.HasChanges () :

Verifica se vengono rilevate nuove entità eliminate o modificate in modo che tali modifiche vengano inviate al database se viene richiamato DbContext.SaveChanges o DbContext.SaveChangesAsync. Si noti che questo metodo chiama ChangeTracker.DetectChanges a meno che ChangeTracker.AutoDetectChangesEnabled sia stato impostato su false.



Related

Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché