DBContext's Changetracker -Problem
-
25-10-2019 - |
Frage
Ich habe ein Codefirst EF-4.1-basiertes Programm. Der Benutzer erhält einen Kontext und kann einige Eigenschaften ändern. Wenn der Benutzer fertig ist, mache ich schnell
ChangeTracker.Entries().Any(e => e.State != EntityState.Unchanged);
um festzustellen, ob a SaveChanges()
ist erforderlich oder nicht. Wenn ich einen "Savechanges ()" -Anruf mache, werden die Änderungen, die vorgenommen wurden, in der Datenbank bestehen.
Dies funktioniert für einige Eigenschaften und funktioniert für andere nicht. Insbesondere scheint es mit einfachen Typen zu funktionieren (float
s) und mit Sammlungshierarchien (ObservableCollection
s).
Mache ich etwas falsch?
Lösung
Ja, das ist ein Problem. Einige Beziehungen werden nicht verfolgt von DbChangeTracker
. Es gibt einen Unterschied zwischen Unabhängiger Verein und ausländischer Key Association. Änderungen der Beziehung werden im Falle von: verfolgt:
- Eins-zu-eins
- Eins-zu-Viele-Verhältnis zu Foreign Key Association-Sie sollten ausländische Schlüsseleigentum einrichten
Änderungen der Beziehung werden bei: nicht verfolgt:
- Eins-zu-Viele-Verhältnis zur unabhängigen Vereinigung
- Viele-zu-Viele-Verhältnisse, die immer eine unabhängige Assoziation sind
Nicht verfolgt für unabhängige Vereinigung ist keine korrekte Benennung. Diese Änderungen werden aber verfolgt DbChangeTracker
enthüllt keinen Zugriff auf diese Änderungen! Sie müssen konvertieren DbContext
zu ObjectContext
und verwenden ObjectStateManager
Zugang zu Zugang zu erhalten ObjectStateEntries
Darstellung unabhängiger Assoziationen.
In diesem Fall ist das einfachste, einfach anzurufen SaveChanges
stets. Es werden keine DB -Befehle ausgeführt, wenn keine Daten gespeichert werden müssen.