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.
Odpowiedz
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();
+1 za bycie ogólnie na właściwej ścieżce, ale używaj' Any() ', a nie' Count()> 0'. –
Pocałuj - po prostu przeczytaj swój blog na ten temat już dziś! Dzięki;) – Yakimych
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. –
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.
Począwszy od wersji EF 6, istnieje context.ChangeTracker.HasChanges()
.
Najbardziej aktualna odpowiedź. – Zapnologica
Od 2016 roku to jest odpowiedź, IMHO. – ozgur
To jest teraz najlepsza odpowiedź, o której wspominali inni. – Yokomoko
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