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