Le problème de ChangeTracker DbContext
-
25-10-2019 - |
Question
J'ai un programme EF-4.1 codefirst. L'utilisateur obtient un contexte et peut modifier certaines propriétés. Lorsque l'utilisateur se fait, je fais un rapide
ChangeTracker.Entries().Any(e => e.State != EntityState.Unchanged);
pour déterminer si un SaveChanges()
est nécessaire ou non. Si je fais un « SaveChanges () » appel, les changements qui ont fait sont conservés à la base de données.
Cela fonctionne pour certaines propriétés, et ne fonctionne pas pour les autres. Plus précisément, il semble fonctionner avec des types simples (float
s) et des hiérarchies de collecte (ObservableCollection
s).
Ai-je fait quelque chose de mal?
La solution
Oui, c'est un problème. Certaines relations ne sont pas suivis par DbChangeTracker
. Il y a une différence entre association indépendante et d'association clé étrangère . Les changements à la relation sont suivis en cas de:
- Une à une relation qui est toujours association clé étrangère dans EFv4 +
- Un à plusieurs relations avec l'association clé étrangère - vous devez configurer la propriété clé étrangère
Les modifications à la relation ne sont pas suivis en cas de:
- Un à plusieurs relation avec l'association indépendante
- Beaucoup à plusieurs relation qui est toujours association indépendante
Non suivi pour l'association indépendante n'est pas correct nommage. Ces changements sont suivis, mais ne DbChangeTracker
pas exposer l'accès à ces changements ! Vous devez convertir DbContext
à ObjectContext
de ObjectStateManager
et à utiliser pour obtenir l'accès à ObjectStateEntries
représentant des associations indépendantes.
Dans ce cas, la chose la plus facile est tout simplement appel SaveChanges
toujours. Il n'exécutera toutes les commandes DB si aucune donnée ne doivent être enregistrées.