2009-08-03 9 views
7

J'ai trouvé an MSDN article qui décrit comment gère EF lors concurrency l'enregistrement des modifications:Optimiste dans concurrency ADO.NET Entity Framework

Par défaut [...] Object Services enregistre objet modifications à la base de données sans vérification pour la simultanéité. Pour propriétés qui pourraient éprouver un degré élevé de concurrence, nous recommandons soit défini la propriété d'entité dans la couche conceptuelle avec un attribut de ConcurrencyMode = « fixe »

J'ai deux questions:

  1. Avoir aucune propriété dans mon modèle où ConcurrencyMode="fixed", est-il sûr pour moi de penser que si jamais un OptimisticConcurrencyException est jeté lors de l'enregistrement des modifications, il est dû au fait que l'entité ne exis ts dans le magasin de données, c'est-à-dire qu'il a été supprimé par un autre utilisateur, ou ai-je oublié quelque chose?

    j'imagine EF exécution d'un UPDATE -Déclaration qui ressemble à quelque chose comme ça, qui, comme je le vois, ne fera que provoquer un OptimisticConcurrencyException à la levée si personne ID = 1 n'existe pas:

    UPDATE Person SET FirstName = 'John' AND LastName = 'Smith' WHERE ID = 1 
    
  2. Lors de l'utilisation de ConcurrencyMode="fixed", EF vérifie-t-il la simultanéité lors de la suppression d'entités? En d'autres termes, exécutera EF jamais un DELETE -Déclaration qui ressemble à ceci (avec plus que la clé primaire dans le WHERE -clause):

    DELETE FROM Person WHERE ID = 1 AND LastName = 'Doe' 
    

Répondre

6

Bonne question.

(1) Oui, mais malheureusement ce n'est pas si simple. Parce que le EF (3.5) a un modèle d'association indépendant, l'association est traitée indépendamment, et même si vous ne l'avez pas dit, elle devient partie intégrante des vérifications de simultanéité au cours des mises à jour et des suppressions.

à savoir lorsque vous mettez à jour une personne que vous verrez souvent des mises à jour qui ressemblent à ceci:

UPDATE Person SET Partner = NULL AND FirstName = 'John' AND LastName = 'Smith' 
WHERE ID = 1 AND Partner = 2 

à savoir Partner est une colonne FK.

Tout cela change dans 4.0 si vous utilisez des associations FK, comme nous attendons la plupart des gens aussi.

(2) Pour DELETE, toutes les propriétés ConcurrencyMode = 'fixed' ont été vérifiées pendant la suppression. L'exception est lorsque vous avez un SPROC pour la suppression qui n'accepte pas les valeurs de simultanéité.

Hope this helps

Alex

+0

Bonne réponse. C'était exactement l'information que je cherchais. Merci beaucoup! – bernhof

Questions connexes