Com o Entity Framework você não pode fazer disso uma operação "atômica". Você tem os passos:
- Carregar entidade do banco de dados
- Alterar contador na memória
- Salvar entidade alterada no banco de dados
Entre essas etapas, outro cliente pode carregar a entidade do banco de dados que ainda possui o valor antigo.
A melhor maneira de lidar com essa situação é usar a simultaneidade otimista . Isso basicamente significa que a alteração na etapa 3 não será salva se o contador não for mais o mesmo de quando você carregou a entidade na etapa 1. Em vez disso, você receberá uma exceção que pode ser tratada recarregando a entidade e reaplicando a mudança.
O fluxo de trabalho ficaria assim:
- No
Work
entidade oWordCount
A propriedade deve ser marcada como um token de simultaneidade (anotações ou API Fluent no caso de Code-First) - Carregar entidade do banco de dados
- Alterar contador na memória
- Chame
SaveChanges
em umtry-catch
bloquear e capturar exceções do tipoDbUpdateConcurrencyException
- Se ocorrer uma exceção, recarregue a entidade no
catch
bloco do banco de dados, aplique a alteração novamente e chameSaveChanges
novamente - Repita a última etapa até que não ocorra mais nenhuma exceção
Em esta resposta você pode encontrar um exemplo de código para este procedimento (usando
DbContext
).