Mysql
 sql >> Base de données >  >> RDS >> Mysql

Ignorer les entrées en double et valider celles qui réussissent sur DbContext.SaveChanges() dans EF Core

On dirait que vous avez un problème commercial en place. Tout d'abord, vous devez décider de ce qui se passera lorsque vous avez déjà une entité avec le même identifiant en place et que quelqu'un essaie d'en insérer une nouvelle (nouvelle information) avec le même identifiant.

Il semble que vous ayez déjà décidé :vous voulez abandonner l'action.

C'est en quelque sorte inhabituel car si vous recevez de nouvelles données des clients de cette API sur une entité qui existait déjà dans votre base de données -> cela ressemble plus à une mise à jour.

Il existe des bibliothèques qui peuvent faire quelque chose de similaire :https://github.com/borisdj/EFCore.BulkExtensions (qui ne fonctionne actuellement qu'avec MsSQL)

Utilisation de cette bibliothèque (qui est connue et déjà mentionnée par Microsoft comme étant un EF Core Tool :https://docs.microsoft.com/en-us/ef/core/extensions/ ) vous avez la possibilité de :

  • Insérez ou mettez à jour toutes les données (toutes les colonnes) si vous trouvez une entité avec le même identifiant (Upsert) :

    context.BulkInsertOrUpdateAsync(entitiesList);

  • Synchronisez les entités de votre base de données avec les entités que vous recevez des clients :

    context.BulkInsertOrUpdateOrDeleteAsync(entitiesList);

Vous ne trouverez probablement pas quelque chose de déjà implémenté pour votre cas, mais vous pouvez ajuster cette bibliothèque avec :

BulkInsertOrDropAsync 

Qui fera quelque chose comme :

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) 

Ce qui n'est pas vraiment un DROP, mais cela laissera vos données intactes.