W przypadku Entity Framework nie można uczynić tej operacji "atomową". Masz kroki:
- Załaduj jednostkę z bazy danych
- Zmień licznik w pamięci
- Zapisz zmienioną jednostkę w bazie danych
Pomiędzy tymi krokami inny klient może załadować jednostkę z bazy danych, która nadal ma starą wartość.
Najlepszym sposobem radzenia sobie z tą sytuacją jest użycie optymistycznej współbieżności . Zasadniczo oznacza to, że zmiana w kroku 3 nie zostanie zapisana, jeśli licznik nie będzie już taki sam, jak podczas ładowania encji w kroku 1. Zamiast tego otrzymasz wyjątek, który możesz obsłużyć, ponownie ładując encję i ponowne zastosowanie zmiany.
Przepływ pracy wyglądałby tak:
- W
Work
podmiotWordCount
właściwość musi być oznaczona jako token współbieżności (adnotacje lub Fluent API w przypadku Code-First) - Załaduj jednostkę z bazy danych
- Zmień licznik w pamięci
- Zadzwoń do
SaveChanges
wtry-catch
blokuj i łap wyjątki typuDbUpdateConcurrencyException
- Jeśli wystąpi wyjątek, przeładuj encję w
catch
bloku z bazy danych, zastosuj zmianę ponownie i wywołajSaveChanges
ponownie - Powtórz ostatni krok, aż nie będzie już wyjątku
W tej odpowiedzi
możesz znaleźć przykładowy kod dla tej procedury (używając DbContext
).