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
WorkpodmiotWordCountwł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
SaveChangeswtry-catchblokuj i łap wyjątki typuDbUpdateConcurrencyException - Jeśli wystąpi wyjątek, przeładuj encję w
catchbloku z bazy danych, zastosuj zmianę ponownie i wywołajSaveChangesponownie - 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 ).