Converter visualização em tabelas e salvar alterações me dá uma exceção de simultaneidade otimista
-
12-12-2019 - |
Pergunta
Estou trabalhando com Entity Framework 4 (usando entidades de auto-rastreamento), e acessando uma view, que é a mesclagem de duas tabelas.Então quando atualizo as informações da view, envio o STE da view para o repositório que acessa o banco de dados.
Eu fiz o seguinte:
Quando recebo minha visualização com as informações atualizadas, crio meu STE1 e STE2.Como quando eu crio um STE, este é criado com um estado adicionado.Então, como eu sei para o estado do STE da visão que o estado está modificado, eu mudo o estado dos meus dois STEs com o método MarkedAsModified
.
Então, como eu tenho no STE da view as informações das duas tabelas, passo as informações da view para o STE correto, e aplico as alterações do STE para o objectContext
.
Finalmente eu faço o saveChanges
.Mas nesta etapa recebo um Optimistic concurrency exception
.Acho que é porque o STE passa de estado para Added
para Modified
então o contexto detecta que há alguma modificação entre a criação e o SaveChanges
, mas também tento AcceptChanges
no STE, posteriormente marcado como modificado e, aplicar as alterações e por fim SaveChanges
, mas o problema persiste.
Como posso resolver o problema?existe uma maneira melhor de trabalhar com view e Entity Framework v4?
Obrigado.Daimroc.
EDITAR 1:Eu ainda tenho problemas.Meu código é o seguinte:
Componentes meuComponent = new Componentes();// Este é um ste myComponent.rereference = myView.reference;...// Outras propriedades myComponent.markedasModified ();//isso é necessário porque quero atualizar informações, não adicionar um novo registro.myContext.ApplyChanges("Componentes", myComponent);miContexto.SaveChanges();
No saveChanges, recebo a exceção:A instrução update, insert ou delete afetou um número inesperado de linhas (0).As entidades podem ter sido modificadas ou excluídas desde que foram carregadas.Atualize as entradas do ObjectStateManager.
Qual é o problema?não posso modificar um novo STE criado?
Obrigado.
Solução
Eu encontrei a maneira de resolver o problema.
Numa primeira solução, a solução foi fazer uma consulta à base de dados para obter os registos existentes na base de dados.Isso adiciona as entidades no contexto e então é possível modificar os dados e salvar as alterações corretamente.
Mas depois encontrei uma maneira de evitar a necessidade de fazer a consulta ao banco de dados para adicionar as entidades modificadas no contexto.
O jeito é usar o seguinte código:
Customers myCustomer = new Customers { IDCustomer = myCustomer.IDCustomer };
myContext.Customers.Attach(myCustomer);
//update the data of the entity.
myContext.SaveChanges();
A solução é criar uma nova entidade definindo a chave primária.Se a entidade tivesse FK seria indicado da mesma forma.Neste ponto, a entidade possui o estado adicionado.
Posteriormente, é anexado ao contexto e pode ser modificado.Quando um campo é alterado, a entidade muda seu estado para modificado, portanto, quando saveChanges() é chamado, o EF atualiza a entidade, não tenta adicionar uma nova.
Eu encontro essa informação neste link.Neste post a solução é deletar uma entidade sem recuperá-la para o banco de dados, mas a ideia também funciona se quisermos modificar um cadastro existente.