Exceções de simultaneidade no Entity Framework
-
21-12-2019 - |
Pergunta
Ao ligar SaveChanges
/ SaveChangesAsync
no Entity Framework (CF, C#), se ocorrer um conflito de alteração (por exemplo, os valores foram atualizados desde a última leitura), qual dessas duas exceções DbUpdateConcurrencyException
OU OptimisticConcurrencyException
devo pegar?
E qual é a diferença entre eles?
Solução
DbUpdateConcurrencyException
é uma exceção específica lançada por DbContext
, então este é o único a capturar.Esta exceção pode ser causada por um problema subjacente OptimisticConcurrencyException
, mas se for o caso, essa exceção será encapsulada como a exceção interna.
Nem todas as exceções de atualização são causadas por simultaneidade, então você também precisa capturar DbUpdateException
depois pegando DbUpdateConcurrencyException
(porque o último é um subtipo de DbUpdateException
).
Veja também O Entity Framework 5.0 lida com exceção de simultaneidade otimista?.
Outras dicas
Você receberá um OptimisticConcurrencyException
.Dê uma olhada em esse.
Agora chegando à diferença.
- OptimisticConcurrencyException:lançado quando ocorre uma violação de simultaneidade otimista (suponha que mais de uma pessoa esteja mudando para o mesmo resultado), e isso causará o problema de não estar sincronizado)
- DbUpdateConcurrencyException:Exceção lançada por DbContext quando o comportamento esperado é que SaveChanges para uma entidade resulte em uma atualização do banco de dados, mas na verdade nenhuma linha no banco de dados foi afetada.Isso mostra que o banco de dados foi atualizado simultaneamente e um token de simultaneidade que deveria corresponder não correspondeu de fato.As entradas de estado referenciadas por esta exceção não são serializadas devido à segurança e o acesso às entradas de estado após a serialização retornará nulo.