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:

  1. Não tendo propriedades em meu modelo, onde ConcurrencyMode="fixed", é seguro para mim supor que, se alguma vez um OptimisticConcurrencyException é 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á uma OptimisticConcurrencyException para ser jogado Se a pessoa com ID = 1 não existe:

    UPDATE Person SET FirstName = 'John' AND LastName = 'Smith' WHERE ID = 1
    
  2. Ao usar ConcurrencyMode="fixed", faz verificação EF para concorrência ao excluir entidades também? Em outras palavras, vai EF sempre executar um DELETE-afirmação de que é assim (com mais do que apenas a chave primária na WHERE-clause):

    DELETE FROM Person WHERE ID = 1 AND LastName = 'Doe'
    
Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top