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
WorkentitaWordCountvlastnost 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
SaveChangesvtry-catchblokovat a zachytávat výjimky typuDbUpdateConcurrencyException - Pokud dojde k výjimce, znovu načtěte entitu v
catchblok z databáze, aplikujte změnu znovu a zavolejteSaveChangesznovu - 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 ).