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 (floats) et des hiérarchies de collecte (ObservableCollections).

Ai-je fait quelque chose de mal?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top