62

C'è un modo per scoprire se ci sono cambiamenti non salvati nel mio contesto entità, in Entity Framework?Verificare se ci sono modifiche in sospeso da salvare

+0

Does context.savechanges() non controlla automaticamente questo? La ragione per cui mi chiedo è che penso che alcune persone proveranno a fare quanto segue: 'if (db.ChangeTracker.HasChanges()) {wait db.SaveChangesAsync(); } – Zapnologica

risposta

57

Questo potrebbe funzionare (se da cambiamenti intendi aggiunto, rimosso e le entità modificato):

bool changesMade = (context.ObjectStateManager.GetObjectStateEntries(EntityState.Added).Count() + 
        context.ObjectStateManager.GetObjectStateEntries(EntityState.Deleted).Count() + 
        context.ObjectStateManager.GetObjectStateEntries(EntityState.Modified).Count() 
        ) > 0; 

Edit:

codice Improved:

bool changesMade = context. 
        ObjectStateManager. 
        GetObjectStateEntries(EntityState.Added | 
             EntityState.Deleted | 
             EntityState.Modified 
             ).Any(); 
+11

+1 per essere generalmente sulla traccia corretta, ma usare 'Any()', non 'Count()> 0'. –

+0

Davvero - leggi il tuo blog post su questo oggi! Grazie;) – Yakimych

+0

Nota che EF non controlla se il valore è veramente diverso (per 'EntityState.Modified'). e.q. se si sostituisce un valore da solo, EF restituirà '1 oggetto modificato'. Devi controllare in anticipo se il valore è diverso. –

40

Per quelli di voi utilizzando EF 4+, ecco una soluzione equivalente come metodo di estensione:

public static class DbContextExtensions { 
    public static Boolean HasPendingChanges(this DbContext context) { 
     return context.ChangeTracker.Entries() 
         .Any(e => e.State == EntityState.Added 
          || e.State == EntityState.Deleted 
          || e.State == EntityState.Modified); 
    } 
} 

Si noti che non è possibile combinare i valori come maschera di bit. La funzione GetObjectStateEntries() ha gestito la logica per te, ma LINQ non produrrà risultati corretti.

+4

Grazie, la risposta accettata non ha funzionato per me mentre la tua ha fatto (EF v.4.3). – Christian

+1

'EntityState' per' EntityState.Added' è da 'System.Data.Entity' e non da' System.Data'. – Yuck

68

A partire da EF 6, c'è context.ChangeTracker.HasChanges().

+1

La risposta più aggiornata. – Zapnologica

+1

A partire dal 2016 questa è la risposta, IMHO. – ozgur

+0

Questa è ora la migliore risposta come altri hanno menzionato. – Yokomoko