62

Gibt es eine Möglichkeit herauszufinden, ob in meinem Entitätskontext im Entity Framework nicht gespeicherte Änderungen vorhanden sind?Überprüfen Sie, ob noch ausstehende Änderungen gespeichert werden.

+0

Wird context.savechanges() nicht automatisch überprüft? Grund ist, dass ich glaube, dass ein paar Leute versuchen werden, folgendes zu tun: 'if (db.ChangeTracker.HasChanges()) {erwarte db.SaveChangesAsync(); } ' – Zapnologica

Antwort

57

Dies könnte funktionieren (wenn durch Veränderungen bedeuten Sie, entfernt und modifizierte Einheiten hinzugefügt):

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

Edit:

Verbesserte Code:

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

+1 für im Allgemeinen auf der richtigen Spur, aber verwenden Sie' Any() ', nicht' Count()> 0'. –

+0

Darn es - lesen Sie einfach Ihren Blogpost diesbezüglich heute! Danke;) – Yakimych

+0

Beachten Sie, dass EF nicht prüft, ob der Wert wirklich anders ist (für den 'EntityState.Modified'). e.q. Wenn Sie einen Wert selbst ersetzen, gibt EF '1 modifiziertes Objekt' zurück. Sie müssen vorher prüfen, ob der Wert unterschiedlich ist. –

40

Für die von Ihnen Unter Verwendung von EF 4+ ist hier eine äquivalente Lösung als eine Verlängerungsmethode:

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); 
    } 
} 

Beachten Sie, dass Sie die Werte nicht als Bitmaske kombinieren können. Die Funktion GetObjectStateEntries() hat die Logik für Sie verarbeitet, aber LINQ wird keine korrekten Ergebnisse liefern.

+4

Danke, die angenommene Antwort funktionierte bei mir nicht, während es bei dir der Fall war (EF v.4.3). – Christian

+1

'EntityState' für' EntityState.Added' stammt von 'System.Data.Entity' und nicht von' System.Data'. – Yuck

68

Beginnend mit EF 6 gibt es context.ChangeTracker.HasChanges().

+1

Aktuellste Antwort. – Zapnologica

+1

Ab 2016 ist dies die Antwort, IMHO. – ozgur

+0

Dies ist jetzt die beste Antwort, wie andere bereits erwähnt haben. – Yokomoko