Como eu posso atualizar no Linq uma entidade que está desconectado do banco de dados?

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

  •  09-06-2019
  •  | 
  •  

Pergunta

O código abaixo não funciona corretamente e lança InvalidOperationExcepiton.

public void Foo()
{
 DataContext context = new DataContext();
 LinqEntity item = new LinqEntity(){ Id = 1, Name = "John", Surname = "Doe"} ;
 context.LinqEntities.Attach(item, true);
}
Foi útil?

Solução

Por padrão, as entidades irão utilizar todos os campos, para verificação de simultaneidade ao fazer edições.É o que está jogando o InvalidOperationException.

Esta pode ser a definição de Atualização de Verificação de propriedade para todos os campos para Nunca.Isso deve ser feito em todos os campos para anexar a entidade como modificado.Se isso for feito, uma chamada adicional para o contexto.SubmitChanges() irá salvar os dados.

Alternativamente, se você sabe os valores originais, você pode anexar e, em seguida, fazer as atualizações, mas todos os valores que estão sendo verificados, devem coincidir com os valores originais.

LinqEntity item = new LinqEntity(){ Id = 1, Name = "OldName", Surname = "OldSurname"}; 
context.LinqEntities.Attach(item);
item.Name = "John";
item.Surname = "Doe";
context.SubmitChanges();

Outras dicas

Eu não tenho certeza do que você quer dizer com desconectado do banco de dados.

Parece que você está tentando inserir uma nova linha na LinqEntities tabela -- isso é correto?

Se for esse o caso, você vai querer fazer

context.LinqEntities.InsertOnSubmit(item);
context.Submit();

OK, se você está tentando atualizar um registro com ID = 1, você vai fazer assim:

DataContext context = new DataContext();
LinqEntity item = (from le in context.LinqEntities
                  where le.ID == 1
                  select le).Single();
item.Name = "John";
item.Surname = "Doe";

context.Submit();

Você também pode substituir o Linq expressão mais concisa lambda:

LinqEntity item = context.LinqEntities.Single(le => le.ID == 1);

A coisa mais importante que o DataContext faz é controlar qualquer mudança que você fizer, de modo que quando você chamar o método de envio será autogenerate as instruções de Inserção para as coisas que você mudou.

Quando utilizar um ORM você normalmente selecione um objeto antes de atualizá-lo.

Você pode usar DataContext.ExecuteCommand(...) para ignorar o ORM se você não quiser fazer uma escolha.

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