simultaneidade otimista em ADO.NET Entity Framework
-
10-07-2019 - |
Pergunta
um artigo MSDN que descreve como EF lida com simultaneidade quando salvar as alterações:
Por padrão [...] serviços de objeto salva objeto muda para o banco de dados sem verificação de simultaneidade . Para propriedades que a experiência poder um alto grau de concorrência, nós Recomendamos que a propriedade entidade ser definida na camada com conceptual um atributo de ConcurrencyMode = "fixo"
Eu tenho duas perguntas:
-
Não tendo propriedades em meu modelo, onde
ConcurrencyMode="fixed"
, é seguro para mim supor que, se alguma vez umOptimisticConcurrencyException
é lançada quando salvar as alterações, é porque a entidade não existe no armazenamento de dados, ou seja, ele tem sido excluída por outro usuário, ou estou faltando alguma coisa?Eu imagino EF execução de uma
UPDATE
-afirmação de que é algo como isto, o que, a meu ver, só fará umaOptimisticConcurrencyException
para ser jogado Se a pessoa com ID = 1 não existe:UPDATE Person SET FirstName = 'John' AND LastName = 'Smith' WHERE ID = 1
-
Ao usar
ConcurrencyMode="fixed"
, faz verificação EF para concorrência ao excluir entidades também? Em outras palavras, vai EF sempre executar umDELETE
-afirmação de que é assim (com mais do que apenas a chave primária naWHERE
-clause):DELETE FROM Person WHERE ID = 1 AND LastName = 'Doe'
Solução
Boa pergunta.
(1) Sim, mas infelizmente não é bem este simples. Porque o EF (3,5) tem um modelo de associação independente, a associação é tratado de forma independente também, e mesmo que você não disse para que ele se torna parte das verificações de simultaneidade durante atualizações e exclusões.
i. quando você atualizar uma pessoa muitas vezes você vai ver as atualizações que se parecem com isto:
UPDATE Person SET Partner = NULL AND FirstName = 'John' AND LastName = 'Smith'
WHERE ID = 1 AND Partner = 2
i. Parceiro é uma coluna FK.
Isso tudo muda em 4.0 se você usar associações FK, como esperamos que a maioria das pessoas também.
(2) Para excluir qualquer ConcurrencyMode = propriedades 'fixos' são verificados durante a exclusão. A exceção é quando você tem um SPROC de exclusão que não aceita que os valores de simultaneidade.
Espero que isso ajude
Alex