Alguém tem sugestões sobre a maneira mais eficiente de implementar a lógica "atualizar linha, se existir outra inserção" usando o Entity Framework?
c#
entity-framework
Jonathan Wood
fonte
fonte
Respostas:
Se você estiver trabalhando com um objeto anexado (objeto carregado da mesma instância do contexto), poderá simplesmente usar:
Se você pode usar algum conhecimento sobre a chave do objeto, pode usar algo como isto:
Se você não pode decidir a existência do objeto por seu ID, deve executar a consulta de pesquisa:
fonte
using
bloco. Tudo bem deixar o contexto na memória por um tempo? Por exemplo, durante a vida de um formulário do Windows? Normalmente, eu tento limpar os objetos do banco de dados para garantir uma carga mínima no banco de dados. Não há nenhum problema esperando para destruir meu contexto de EF?No Entity Framework 4.3, existe um
AddOrUpdate
método no espaço para nomeSystem.Data.Entity.Migrations
:qual pelo doc :
Para responder ao comentário de @ Smashing1978 , colarei partes relevantes do link fornecido por @Colin
Dito isso, tenho uma situação em que estou extraindo dados de um serviço externo e inserindo ou atualizando valores existentes por chave primária (e meus dados locais para consumidores são somente leitura) - uso
AddOrUpdate
na produção há mais de 6 meses agora sem problemas.fonte
A mágica acontece ao ligar
SaveChanges()
e depende da correnteEntityState
. Se a entidade tiver umEntityState.Added
, ele será adicionado ao banco de dados, se tiver umEntityState.Modified
, será atualizado no banco de dados. Então você pode implementar umInsertOrUpdate()
método da seguinte maneira:Mais sobre EntityState
Se você não pode verificar
Id = 0
para determinar se é uma nova entidade ou não, verifique a resposta de Ladislav Mrnka .fonte
Se você sabe que está usando o mesmo contexto e não desanexando nenhuma entidade, é possível criar uma versão genérica como esta:
db
é claro que pode ser um campo de classe ou o método pode ser feito estático e uma extensão, mas esse é o básico.fonte
A resposta de Ladislav foi próxima, mas tive que fazer algumas modificações para que isso funcionasse no EF6 (primeiro no banco de dados). Estendi meu contexto de dados com meu método AddOrUpdate e até agora isso parece estar funcionando bem com objetos desanexados:
fonte
Na minha opinião, vale dizer que, com o recém-lançado EntityGraphOperations for Entity Framework Code Primeiro, você pode evitar escrever alguns códigos repetitivos para definir os estados de todas as entidades no gráfico. Eu sou o autor deste produto. E publiquei no github , code-project ( inclui uma demonstração passo a passo e um projeto de amostra está pronto para download) e nuget .
Ele definirá automaticamente o estado das entidades como
Added
ouModified
. E você escolherá manualmente quais entidades devem ser excluídas se não existir mais.O exemplo:
Digamos que eu tenha um
Person
objeto.Person
poderia ter muitos telefones, um documento e poderia ter um cônjuge.Desejo determinar o estado de todas as entidades incluídas no gráfico.
Além disso, como você sabe, as propriedades-chave exclusivas podem desempenhar um papel ao definir o estado da entidade Telefone. Para tais propósitos especiais, temos
ExtendedEntityTypeConfiguration<>
classe, que herda deEntityTypeConfiguration<>
. Se queremos usar essas configurações especiais, devemos herdar nossas classes de mapeamentoExtendedEntityTypeConfiguration<>
, em vez deEntityTypeConfiguration<>
. Por exemplo:Isso é tudo.
fonte
Inserir outra atualização
fonte
Verifique a linha existente com Qualquer.
fonte
Alternativa para a resposta @LadislavMrnka. Isso se for para o Entity Framework 6.2.0.
Se você tiver um
DbSet
item específico e um que precise ser atualizado ou criado:No entanto, isso também pode ser usado para um genérico
DbSet
com uma única chave primária ou uma chave primária composta.fonte
Corrigido
fonte