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
Work
entiteit deWordCount
eigenschap 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
SaveChanges
in eentry-catch
blok en vang uitzonderingen van het typeDbUpdateConcurrencyException
- Als er een uitzondering optreedt, laadt u de entiteit opnieuw in de
catch
blok uit de database, pas de wijziging opnieuw toe en belSaveChanges
nogmaals - 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
).