Avec Entity Framework, vous ne pouvez pas en faire une opération "atomique". Vous avez les étapes :
- Charger l'entité depuis la base de données
- Changer le compteur en mémoire
- Enregistrer l'entité modifiée dans la base de données
Entre ces étapes, un autre client peut charger l'entité de la base de données qui a toujours l'ancienne valeur.
La meilleure façon de gérer cette situation est d'utiliser la concurrence optimiste . Cela signifie essentiellement que la modification de l'étape 3 ne sera pas enregistrée si le compteur n'est plus le même que lorsque vous avez chargé l'entité à l'étape 1. Au lieu de cela, vous obtiendrez une exception que vous pourrez gérer en rechargeant l'entité et réappliquer la modification.
Le flux de travail ressemblerait à ceci :
- Dans le
Work
entité leWordCount
la propriété doit être marquée comme un jeton de concurrence (annotations ou API Fluent dans le cas de Code-First) - Charger l'entité depuis la base de données
- Changer le compteur en mémoire
- Appelez
SaveChanges
dans untry-catch
bloquer et intercepter les exceptions de typeDbUpdateConcurrencyException
- Si une exception se produit, rechargez l'entité dans le
catch
bloc de la base de données, appliquez à nouveau la modification et appelezSaveChanges
encore - Répétez la dernière étape jusqu'à ce qu'il n'y ait plus d'exception
Dans cette réponse
vous pouvez trouver un exemple de code pour cette procédure (en utilisant DbContext
).