Con Entity Framework non puoi fare di questa un'operazione "atomica". Hai i passaggi:
- Carica entità dal database
- Modifica contatore in memoria
- Salva l'entità modificata nel database
Tra questi passaggi un altro client può caricare l'entità dal database che ha ancora il vecchio valore.
Il modo migliore per affrontare questa situazione è utilizzare la concorrenza ottimistica . In pratica significa che la modifica nel passaggio 3 non verrà salvata se il contatore non è più lo stesso di quando hai caricato l'entità nel passaggio 1. Invece otterrai un'eccezione che puoi gestire ricaricando l'entità e riapplicando la modifica.
Il flusso di lavoro sarebbe simile a questo:
- Nel
Work
entità ilWordCount
la proprietà deve essere contrassegnata come token di concorrenza (annotazioni o API Fluent in caso di Code-First) - Carica entità dal database
- Modifica contatore in memoria
- Chiama
SaveChanges
in untry-catch
blocca e cattura eccezioni di tipoDbUpdateConcurrencyException
- Se si verifica un'eccezione, ricaricare l'entità nel
catch
bloccare dal database, applicare nuovamente la modifica e chiamareSaveChanges
di nuovo - Ripeti l'ultimo passaggio finché non si verificano più eccezioni
In questa risposta
puoi trovare un esempio di codice per questa procedura (usando DbContext
).