Mysql
 sql >> Database >  >> RDS >> Mysql

Ignora le voci duplicate e salva quelle riuscite su DbContext.SaveChanges() in EF Core

Sembra che tu abbia un problema di affari in atto. In primo luogo è necessario decidere cosa accadrà quando si dispone già di un'entità con lo stesso ID e qualcuno tenta di inserirne una nuova (nuove informazioni) con lo stesso ID.

Sembra che tu abbia già deciso:vuoi abbandonare l'azione.

Questo è in qualche modo insolito perché se ricevi nuovi dati dai client di quell'API su un'entità che esisteva già nel tuo database -> sembra più un aggiornamento.

Esistono alcune librerie che possono fare qualcosa di simile:https://github.com/borisdj/EFCore.BulkExtensions (che attualmente funziona solo con MsSQL)

Utilizzo di questa libreria (che è nota ed è già stata menzionata da Microsoft come strumento EF Core:https://docs.microsoft.com/en-us/ef/core/extensions/ ) hai la possibilità di:

  • Inserisci o Aggiorna tutti i dati (tutte le colonne) se trovi un'entità con lo stesso ID (Upsert):

    context.BulkInsertOrUpdateAsync(entitiesList);

  • Sincronizza le entità dal tuo database con le entità che ricevi dai clienti:

    context.BulkInsertOrUpdateOrDeleteAsync(entitiesList);

Molto probabilmente non troverai qualcosa di già implementato per il tuo caso, ma puoi modificare questa libreria con:

BulkInsertOrDropAsync 

Che farà qualcosa come:

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) 

Che non è proprio un DROP, ma lascerà intatti i tuoi dati.