2015-09-15 16 views
7

I'm stumped: l'aggiornamento a Entity Framework 7 e in genere sovrascrivo le SaveChanges all'interno dello 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 vorrei ottenere le modifiche del modello in questo modo:Ottenere l'elenco di oggetti modificati all'interno di Entity Framework 7

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

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

Tuttavia ora che ObjectContext viene rimosso entro Entity Framework 7, mi sono bloccato, come potrei all'interno Entity Framework 7 ottenere una lista degli oggetti modificati?

+1

use 'context.ChangeTracker.Entries(). Dove (x => x.State == ...)' – dotctor

+1

@dotctor aggiungi come risposta in modo da poter accettare quella risposta –

risposta

5

È possibile utilizzare DbContext.ChangeTracker

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

Come ottengo le Proprietà modificate da ChangeTracker –

0

codice s' @dotctor potrebbe non funzionare in alcuni casi.

Ci sono alcuni casi in cui il tracker delle modifiche potrebbe non avere le informazioni aggiornate per quanto riguarda le entità gestite dal contesto, quindi un'entità potrebbe essere modificata/aggiunta/eliminata senza che il tracker delle modifiche sia consapevole. Per evitare questo caso, vorrei avvolgere il codice 's il @dotctor nella seguente condizione:

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


Microsoft Sintesi ChangeTracker.HasChanges():

Controlla se tutti i nuovi, cancellati, o le entità modificate vengono monitorate in modo tale che tali modifiche vengano inviate al database se viene chiamato DbContext.SaveChanges o DbContext.SaveChangesAsync. Si noti che questo metodo chiama ChangeTracker.DetectChanges a meno che ChangeTracker.AutoDetectChangesEnabled sia stato impostato su false.