Gibt es eine Möglichkeit, herauszufinden, ob es in meinem Entitätskontext im Entitätsframework nicht gespeicherte Änderungen gibt?
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:
bool changesMade = context.
ObjectStateManager.
GetObjectStateEntries(EntityState.Added |
EntityState.Deleted |
EntityState.Modified
).Any();
Any()
nicht verwenden Count() > 0
.
EntityState.Modified
) wirklich unterschiedlich ist . Wenn Sie einen Wert durch sich selbst ersetzen, gibt EF zurück 1 modified object
. Sie müssen vorher prüfen, ob der Wert unterschiedlich ist.
Ab EF 6 gibt es context.ChangeTracker.HasChanges()
.
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.
EntityState
denn EntityState.Added
ist von System.Data.Entity
und nicht von System.Data
.
if (db.ChangeTracker.HasChanges()) { await db.SaveChangesAsync(); }