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?
È possibile utilizzare DbContext.ChangeTracker
var modifiedEntries = context.ChangeTracker
.Entries()
.Where(x => x.State == EntityState.Modified)
.Select(x =>x.Entity)
.ToList();
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.