Met Entity Framework kun je hier geen "atomaire" operatie van maken. Je hebt de stappen:
- Entiteit laden uit database
- Wijzig teller in geheugen
- Gewijzigde entiteit opslaan in database
Tussen deze stappen door kan een andere klant de entiteit laden uit de database die nog de oude waarde heeft.
De beste manier om met deze situatie om te gaan, is door gebruik te maken van optimistische gelijktijdigheid . Het betekent in feite dat de wijziging in stap 3 niet wordt opgeslagen als de teller niet meer hetzelfde is als toen u de entiteit in stap 1 laadde. In plaats daarvan krijgt u een uitzondering die u kunt afhandelen door de entiteit opnieuw te laden en de wijziging opnieuw toepassen.
De workflow ziet er als volgt uit:
- In het
Workentiteit deWordCounteigenschap moet worden gemarkeerd als een gelijktijdigheidstoken (annotaties of Fluent API in het geval van Code-First) - Entiteit laden uit database
- Wijzig teller in geheugen
- Bel
SaveChangesin eentry-catchblok en vang uitzonderingen van het typeDbUpdateConcurrencyException - Als er een uitzondering optreedt, laadt u de entiteit opnieuw in de
catchblok uit de database, pas de wijziging opnieuw toe en belSaveChangesnogmaals - Herhaal de laatste stap totdat er geen uitzondering meer optreedt
In dit antwoord
u kunt een codevoorbeeld voor deze procedure vinden (met behulp van DbContext ).