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:

  1. N'ayant dans mon modèle aucune propriété où ConcurrencyMode = "fixe" , puis-je supposer que si jamais une OptimisticConcurrencyException 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 une OptimisticConcurrencyException si ID = 1 n'existe pas:

    UPDATE Person SET FirstName = 'John' AND LastName = 'Smith' WHERE ID = 1
    
  2. 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 instruction DELETE ressemblant à ceci (avec plus que la clé primaire dans la clause WHERE ):

    DELETE FROM Person WHERE ID = 1 AND LastName = 'Doe'
    
Était-ce utile?

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

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