problema ChangeTracker di DbContext
-
25-10-2019 - |
Domanda
Ho un programma basato codefirst EF-4.1. L'utente riceve un contesto e può modificare alcune proprietà. Quando l'utente è fatto, faccio un rapido
ChangeTracker.Entries().Any(e => e.State != EntityState.Unchanged);
per determinare se è necessario o meno un SaveChanges()
. Se faccio un 'SaveChanges ()' chiamata, i cambiamenti che hanno fatto sono persistenti al database.
Questo funziona per alcune proprietà, e non funziona per gli altri. In particolare sembra funzionare con tipi semplici (float
s), e con gerarchie di raccolta (ObservableCollection
s).
sto facendo qualcosa di sbagliato?
Soluzione
Sì, questo è un problema. Alcuni rapporti non sono tracciati da DbChangeTracker
. C'è differenza tra e degli Esteri associazione tasto . Modifiche a relazione sono tracciati in caso di:
- One-to-one rapporto che è sempre l'associazione chiave esterna nella EFv4 +
- Uno-a-molti relazione con l'associazione Chiave esterna - è necessario impostare proprietà chiave esterna
Le modifiche al rapporto non sono tracciati in caso di:
- Uno-a-molti relazione con l'associazione indipendente
- molti-a-molti relazione che è sempre un'associazione indipendente
Non monitorati per associazione indipendente non è corretta denominazione. Questi cambiamenti sono monitorati ma DbChangeTracker
non lo fa esporre l'accesso a questi cambiamenti ! È necessario convertire DbContext
a ObjectContext
e l'uso ObjectStateManager
per avere accesso a ObjectStateEntries
che rappresenta le associazioni indipendenti.
In questo caso la cosa più semplice è semplicemente SaveChanges
chiamata sempre. Non verrà eseguito alcun comando DB, se hanno bisogno di essere salvati non ci sono dati.