С Entity Framework не можете да направите това "атомна" операция. Имате следните стъпки:
- Зареждане на обект от база данни
- Промяна на брояча в паметта
- Запазване на променен обект в база данни
Между тези стъпки друг клиент може да зареди обекта от базата данни, който все още има старата стойност.
Най-добрият начин да се справите с тази ситуация е да използвате оптимистичен паралелност . Това по същество означава, че промяната в стъпка 3 няма да бъде запазена, ако броячът вече не е същият, който беше, когато сте заредили обекта в стъпка 1. Вместо това ще получите изключение, с което можете да се справите, като презаредите обекта и повторно прилагане на промяната.
Работният процес би изглеждал така:
- В
Work
обектWordCount
свойството трябва да бъде маркирано като маркер за едновременност (анотации или Fluent API в случай на Code-First) - Зареждане на обект от база данни
- Промяна на брояча в паметта
- Обадете се на
SaveChanges
вtry-catch
блокиране и улавяне на изключения от типDbUpdateConcurrencyException
- Ако възникне изключение, презаредете обекта в
catch
блокирайте от базата данни, приложете промяната отново и извикайтеSaveChanges
отново - Повтаряйте последната стъпка, докато вече не се случи изключение
В този отговор
можете да намерите примерен код за тази процедура (използвайки DbContext
).