S Entity Framework z toho nemůžete udělat "atomickou" operaci. Máte kroky:
- Načíst entitu z databáze
- Počítadlo změn v paměti
- Uložit změněnou entitu do databáze
Mezi těmito kroky může jiný klient načíst entitu z databáze, která má stále starou hodnotu.
Nejlepší způsob, jak se s touto situací vypořádat, je použít optimistický souběh . V zásadě to znamená, že změna v kroku 3 se neuloží, pokud počítadlo již není stejné, jako když jste načetli entitu v kroku 1. Místo toho získáte výjimku, kterou můžete zpracovat znovu načtením entity a znovu použít změnu.
Pracovní postup by vypadal takto:
- V
Work
entitaWordCount
vlastnost musí být označena jako souběžný token (anotace nebo Fluent API v případě Code-First) - Načíst entitu z databáze
- Počítadlo změn v paměti
- Zavolejte
SaveChanges
vtry-catch
blokovat a zachytávat výjimky typuDbUpdateConcurrencyException
- Pokud dojde k výjimce, znovu načtěte entitu v
catch
blok z databáze, aplikujte změnu znovu a zavolejteSaveChanges
znovu - Opakujte poslední krok, dokud již nedojde k žádné výjimce
V této odpovědi
můžete najít příklad kódu pro tento postup (pomocí DbContext
).