Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Ignore entradas duplicadas e confirme as entradas bem-sucedidas em DbContext.SaveChanges() no EF Core


Parece que você tem um problema de negócios no lugar. 1º você precisa decidir o que acontecerá quando você já tiver uma entidade com o mesmo id e alguém tentar inserir uma nova (nova informação) com o mesmo id.

Parece que você já decidiu:você quer desistir da ação.

Isso é de alguma forma incomum porque se você receber alguns novos dados de clientes dessa API sobre uma entidade que já existia em seu banco de dados -> isso se parece mais com um Update.

Existem algumas bibliotecas que podem fazer algo semelhante:https://github.com/borisdj/EFCore.BulkExtensions (que atualmente está trabalhando apenas com MsSQL)

Usando esta biblioteca (que é conhecida e já foi mencionada pela Microsoft como sendo uma EF Core Tool:https://docs.microsoft.com/en-us/ef/core/extensions/ ) você tem a possibilidade de:

  • Insira ou atualize todos os dados (todas as colunas) se você encontrar uma entidade com o mesmo id (Upsert):

    context.BulkInsertOrUpdateAsync(entitiesList);

  • Sincronize entidades do seu banco de dados com quaisquer entidades que você receba dos clientes:

    context.BulkInsertOrUpdateOrDeleteAsync(entitiesList);

Muito provavelmente você não encontrará algo já implementado para o seu caso, mas pode ajustar esta biblioteca com:
BulkInsertOrDropAsync 

Que fará algo como:
WHEN MATCHED THEN UPDATE SET A.ID=A.ID --The ID's are already the same so nothing will happen
WHEN NOT MATCHED THEN INSERT(A.ID,A.NAME,A.CODE,A.DESCRIPTION) 

O que não é realmente um DROP, mas deixará seus dados intactos.