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?

Foi útil?

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.
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top