Überprüfen Sie, ob noch ausstehende Änderungen gespeichert werden müssen


Antworten:


60

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

12
+1 für allgemein auf dem richtigen Weg, aber Any()nicht verwenden Count() > 0.
— Craig Stuntz

Verdammt - lesen Sie noch heute Ihren Blogpost dazu! Danke;)
— Yakimych

Beachten Sie, dass EF nicht prüft, ob der Wert (für 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.
— Matthieu Charbonnier

100

Ab EF 6 gibt es context.ChangeTracker.HasChanges().


3
Die aktuellste Antwort.
— Zapnologica

1
Ab 2016 ist dies die Antwort, IMHO.
— Ozgur

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

Ordentliche Lösung! Danke für das Teilen. Wissen Sie, wie Sie Änderungen rechtzeitig erfassen und das geänderte Formular mit "*" markieren können? wie: Form1 *
— Rapunzo

42

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.


4
Vielen Dank, die akzeptierte Antwort hat bei mir nicht funktioniert (EF v.4.3).
— Christian

1
EntityStatedenn EntityState.Addedist von System.Data.Entityund nicht von System.Data.
— Yuck
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.