Concurrence optimiste dans ADO.NET Entity Framework
-
10-07-2019 - |
Question
J'ai trouvé un article MSDN qui décrit comment EF gère les accès simultanés lors de l’enregistrement des modifications:
Par défaut, Object Services [...] enregistre l'objet. modifications de la base de données sans vérification de la concurrence . Pour propriétés qui pourraient rencontrer un degré élevé de concurrence, nous recommander que la propriété d'entité soit défini dans la couche conceptuelle avec un attribut de ConcurrencyMode = "fixe"
J'ai deux questions:
-
N'ayant dans mon modèle aucune propriété où
ConcurrencyMode = "fixe"
, puis-je supposer que si jamais uneOptimisticConcurrencyException
est émise lors de la sauvegarde changements, c’est que l’entité n’existe plus dans le magasin de données, c’est-à-dire qu’elle a été supprimée par un autre utilisateur ou est-ce que quelque chose me manque?J'imagine que EF exécute une instruction
UPDATE
qui ressemble à ceci, ce qui, selon moi, ne fera que provoquer uneOptimisticConcurrencyException
si ID = 1 n'existe pas:UPDATE Person SET FirstName = 'John' AND LastName = 'Smith' WHERE ID = 1
-
Lors de l'utilisation de
ConcurrencyMode = "fixe"
, EF vérifie-t-il également la simultanéité lors de la suppression d'entités? En d'autres termes, EF exécutera-t-il jamais une instructionDELETE
ressemblant à ceci (avec plus que la clé primaire dans la clauseWHERE
):DELETE FROM Person WHERE ID = 1 AND LastName = 'Doe'
La solution
Bonne question.
(1) Oui, mais malheureusement, ce n’est pas aussi simple. Comme EF (3.5) a un modèle d’association indépendant, l’association est également traitée de manière indépendante, et même si vous ne l’avez pas dit, elle fait partie des vérifications de la simultanéité au cours des procédures UPDATES et DELETES.
i.e. lorsque vous mettez à jour une personne, vous verrez souvent des mises à jour ressemblant à ceci:
UPDATE Person SET Partner = NULL AND FirstName = 'John' AND LastName = 'Smith'
WHERE ID = 1 AND Partner = 2
i.e. Le partenaire est une colonne FK.
Tout change dans la version 4.0 si vous utilisez des associations FK, comme nous nous attendons à la plupart des gens.
(2) Pour DELETE, toutes les propriétés ConcurrencyMode = 'fixed' SONT cochées pendant la suppression. La seule exception est lorsque vous avez un SPROC à supprimer qui n'accepte pas les valeurs de simultanéité.
J'espère que cela vous aidera
Alex