2014-05-02 4 views
2

Je cherche à utiliser Entity Framework 6 pour un nouveau projet. Lorsque nous développons nos tables, nous ajoutons un compteur de mises à jour de type int, et lorsque nous effectuons une mise à jour, nous vérifions qu'il n'a pas été modifié et l'incrémente lors d'une mise à jour réussie. D'après ce que j'ai lu, je peux effectuer la vérification en ajoutant un attribut ConcurrencyCheck à la propriété du compteur de mise à jour, mais comment effectuer l'incrément en cas de mise à jour réussie? Ou devrais-je simplement utiliser une colonne Rowversion à la place?Entity Framework 6 Code First Concurrency

Répondre

3

This Microsoft blog post contient des liens vers un certain nombre de guides EF6 et MVC. Il y en a un en particulier, vous devriez vérifier - Handling Concurrency with the Entity Framework 6. Le guide utilise un projet ASP.Net MVC, mais les principes de la base de données devraient s'appliquer à presque tous les types de projets. En résumé, si vous utilisez un attribut ConcurrencyCheck, vous n'avez pas besoin de mettre à jour vous-même un compteur, mais cela ajoute davantage de frais aux opérations de base de données de votre application car EF extrapolera toutes les requêtes SQL pour inclure la simultanéité vérifie les propriétés auxquelles vous avez appliqué l'attribut ConcurrencyCheck. Si vous avez une très grande table (beaucoup de colonnes), cela peut ralentir les performances des applications. Le meilleur moyen serait d'utiliser l'attribut TimeStamp sur une propriété array byte dans votre classe code-first (ou si vous utilisez Fluent API, vous définissez IsConcurrencyToken() sur la propriété). Ensuite, s'il y a un conflit de concurrence, EF lancera un DbUpdateConcurrencyException - c'est à vous de l'attraper et de le gérer en conséquence.

+0

Ainsi, l'ajout d'un attribut ConcurrencyCheck à une seule colonne devrait entraîner l'incrémentation de EF par la même colonne? Je suppose qu'une colonne ne provoquera pas la performance lente comme vous l'avez décrit. – ScottD

+0

@ScottD oui, mais la concurrence ne sera vérifiée que pour cette colonne. Il est généralement préférable d'utiliser l'horodateur – rwisch45

+0

@ rwisch45 Je dirais que cela dépend uniquement de votre cas d'utilisation. La gestion des versions de lignes peut conduire à une situation très frustrante dans laquelle vous ne pouvez pas faire la différence entre les écritures critiques et non critiques. Il est faux de dire qu'il est généralement préférable d'utiliser le versionnement des lignes plutôt que tout autre contexte sans contexte approprié. –

Questions connexes