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
risposta
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();
+1 per essere generalmente sulla traccia corretta, ma usare 'Any()', non 'Count()> 0'. –
Davvero - leggi il tuo blog post su questo oggi! Grazie;) – Yakimych
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. –
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.
A partire da EF 6, c'è context.ChangeTracker.HasChanges()
.
La risposta più aggiornata. – Zapnologica
A partire dal 2016 questa è la risposta, IMHO. – ozgur
Questa è ora la migliore risposta come altri hanno menzionato. – Yokomoko
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