Gibt es eine Möglichkeit, herauszufinden, ob es in meinem Entitätskontext im Entitätsframework nicht gespeicherte Änderungen gibt?
75
Gibt es eine Möglichkeit, herauszufinden, ob es in meinem Entitätskontext im Entitätsframework nicht gespeicherte Änderungen gibt?
if (db.ChangeTracker.HasChanges()) { await db.SaveChangesAsync(); }
Antworten:
Dies könnte funktionieren (wenn Sie unter Änderungen das Hinzufügen, Entfernen und Ändern von Entitäten verstehen):
bool changesMade = (context.ObjectStateManager.GetObjectStateEntries(EntityState.Added).Count() + context.ObjectStateManager.GetObjectStateEntries(EntityState.Deleted).Count() + context.ObjectStateManager.GetObjectStateEntries(EntityState.Modified).Count() ) > 0;
Bearbeiten:
Verbesserter Code:
quelle
Any()
nicht verwendenCount() > 0
.EntityState.Modified
) wirklich unterschiedlich ist . Wenn Sie einen Wert durch sich selbst ersetzen, gibt EF zurück1 modified object
. Sie müssen vorher prüfen, ob der Wert unterschiedlich ist.Ab EF 6 gibt es
context.ChangeTracker.HasChanges()
.quelle
Für diejenigen unter Ihnen, die EF 4+ verwenden, ist hier eine äquivalente Lösung als Erweiterungsmethode:
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 hat
GetObjectStateEntries()
die Logik für Sie übernommen, aber LINQ liefert keine korrekten Ergebnisse.quelle
EntityState
dennEntityState.Added
ist vonSystem.Data.Entity
und nicht vonSystem.Data
.