2011-04-27 6 views
0

J'ai un programme fondé sur le code EF-4.1. L'utilisateur obtient un contexte et peut modifier certaines propriétés. Lorsque l'utilisateur est fait, je fais un rapideProblème ChangeTracker de DbContext

ChangeTracker.Entries().Any(e => e.State != EntityState.Unchanged); 

pour déterminer si un SaveChanges() est nécessaire ou non. Si je fais un appel 'SaveChanges()', les modifications apportées sont conservées dans la base de données.

Cela fonctionne pour certaines propriétés et ne fonctionne pas pour d'autres. Plus précisément, il semble fonctionner avec des types simples (float s), et avec des hiérarchies de collection (ObservableCollection s).

Est-ce que je fais quelque chose de mal?

Répondre

5

Oui, ceci est un problème. Certaines relations ne sont pas suivies par DbChangeTracker. Il y a une différence entre Independent association and Foreign key association. Les changements à la relation sont suivis en cas de:

  • One-to-one relation qui est toujours association clé étrangère dans EFv4 +
  • One-to-many relation 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:

  • One-to-many relation avec l'association indépendante
  • Relation plusieurs-à-plusieurs qui est toujours une association indépendante

Non suivi pour L'association indépendante n'est pas correcte. Ces changements sont suivis mais DbChangeTrackerdoes not expose access to these changes! Vous devez convertir DbContext en ObjectContext et utiliser ObjectStateManager pour avoir accès à ObjectStateEntries représentant des associations indépendantes.

Dans ce cas, la chose la plus simple est simplement d'appeler SaveChanges toujours. Il n'exécutera aucune commande DB si aucune donnée n'a besoin d'être sauvegardée.

+0

Après quelques tests, j'ai opté pour toujours SaveChanges(). Comme vous le mentionnez, cet appel est bon marché s'il n'y a pas de changement à persister. – Gleno