Converter visualização em tabelas e salvar alterações me dá uma exceção de simultaneidade otimista

StackOverflow https://stackoverflow.com//questions/10689972

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.

Foi útil?

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.

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