62

Czy istnieje sposób sprawdzenia, czy nie są niezapisane zmiany w kontekście mojej jednostki, w Entity Framework?Sprawdź, czy są jakieś oczekujące zmiany do zapisania.

+0

Czy funkcja context.savechanges() nie sprawdza automatycznie tego? Powodem, dla którego pytam, jest to, że myślę, że kilka osób spróbuje wykonać następujące czynności: 'if (db.ChangeTracker.HasChanges()) {czeka na db.SaveChangesAsync(); } ' – Zapnologica

Odpowiedz

57

To może działać (jeśli zmiany masz na myśli dodawać, usuwać i modyfikować jednostki):

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

Edit:

Ulepszony kod:

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

+1 za bycie ogólnie na właściwej ścieżce, ale używaj' Any() ', a nie' Count()> 0'. –

+0

Pocałuj - po prostu przeczytaj swój blog na ten temat już dziś! Dzięki;) – Yakimych

+0

Należy zauważyć, że EF nie sprawdza, czy wartość jest naprawdę inna (dla 'EntityState.Modified'). e.q. jeśli zastąpisz wartość samodzielnie, EF zwróci "1 zmodyfikowany obiekt". Musisz sprawdzić wcześniej, czy wartość jest inna. –

40

Dla tych z Was, przy użyciu EF 4+, tutaj jest równoważne rozwiązanie jako metoda rozszerzenia:

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

Należy pamiętać, że nie można łączyć wartości jako maski bitowej. Funkcja GetObjectStateEntries() obsłużyła dla ciebie logikę, ale LINQ nie przyniesie właściwych wyników.

+4

Dzięki, przyjęta odpowiedź nie zadziałała dla mnie, podczas gdy Twoja była (EF v.4.3). – Christian

+1

'EntityState' dla' EntityState.Added' pochodzi z 'System.Data.Entity', a nie z' System.Data'. – Yuck

68

Począwszy od wersji EF 6, istnieje context.ChangeTracker.HasChanges().

+1

Najbardziej aktualna odpowiedź. – Zapnologica

+1

Od 2016 roku to jest odpowiedź, IMHO. – ozgur

+0

To jest teraz najlepsza odpowiedź, o której wspominali inni. – Yokomoko