Digamos que eu consulte o banco de dados e carregue uma lista de itens. Em seguida, abro um dos itens em um formulário de exibição de detalhes e, em vez de consultar novamente o item do banco de dados, crio uma instância do item a partir da fonte de dados na lista.
Existe uma maneira de atualizar o registro do banco de dados sem buscar o registro do item individual?
Aqui está um exemplo de como estou fazendo isso agora:
dataItem itemToUpdate = (from t in dataEntity.items
where t.id == id
select t).FirstOrDefault();
Então, depois de obter o registro, atualizo alguns valores no item e empurro o registro de volta:
itemToUpdate.itemstatus = newStatus;
dataEntity.SaveChanges();
Eu acho que haveria uma maneira melhor de fazer isso, alguma ideia?
c#
entity-framework
Shane Grant
fonte
fonte
Respostas:
Você deve usar o Attach () método .
Anexando e Desanexando Objetos
fonte
Você também pode usar SQL direto no banco de dados usando o contexto do armazenamento de dados. Exemplo:
Por motivos de desempenho, você pode querer passar variáveis em vez de uma única string SQL codificada. Isso permitirá que o SQL Server armazene a consulta em cache e a reutilize com parâmetros. Exemplo:
ATUALIZAÇÃO - para EF 6.0
fonte
ExecuteStoreCommand
não é realmente uma maneira EF de fazer isso, é apenas usar oDbConnection
contido dentro doDbContext
para executar um comando. Não é agnóstico de banco de dados, muito menos agnóstico de persistência (por exemplo, este exemplo travaria se o OP mudasse para XML).O código:
O resultado TSQL:
Nota:
A linha "IsModified = true" é necessária porque quando você cria o novo objeto ExampleEntity (somente com a propriedade Id preenchida) todas as outras propriedades têm seus valores padrão (0, nulo, etc). Se você deseja atualizar o banco de dados com um "valor padrão", a alteração não será detectada pela estrutura da entidade e, em seguida, o banco de dados não será atualizado.
Por exemplo:
não funcionará sem a linha "IsModified = true", pois a propriedade ExampleProperty, já é nula quando você criou o objeto ExampleEntity vazio, você precisa dizer ao EF que esta coluna deve ser atualizada, e esse é o propósito desta linha.
fonte
Se os
DataItem
campos EF forem pré-validados (como campos não anuláveis), teremos que desabilitar essa validação para este contexto:Caso contrário, podemos tentar satisfazer a pré-validação e ainda atualizar apenas uma única coluna:
Supondo que
dataEntity
seja umSystem.Data.Entity.DbContext
Você pode verificar a consulta gerada adicionando-o a
DbContext
:fonte
Este artigo, como parte do Guia de Introdução da Microsoft, explica os estados de entidade e como fazer isso:
Adicionar / anexar e estados de entidade
Veja a seção 'Anexando uma entidade existente, mas modificada ao contexto'
Agora vou ler o restante desses tutoriais.
fonte
Funciona um pouco diferente no EF Core:
Pode haver uma maneira mais rápida de fazer isso no EF Core, mas o seguinte garante um UPDATE sem ter que fazer um SELECT (testado com EF Core 2 e JET no .NET Framework 4.6.2):
Certifique-se de que seu modelo não tenha propriedades IsRequired
Em seguida, use o seguinte modelo (em VB.NET):
fonte
De modo geral, se você usou o Entity Framework para consultar todos os itens e salvou o objeto de entidade, poderá atualizar os itens individuais no objeto de entidade e chamar
SaveChanges()
quando terminar. Por exemplo:A recuperação de um item que você deseja não deve gerar uma nova consulta.
fonte