Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Ignorieren Sie doppelte Einträge und schreiben Sie erfolgreiche in DbContext.SaveChanges() in EF Core fest

Sieht so aus, als hätten Sie ein geschäftliches Problem. Zuerst müssen Sie entscheiden, was passieren wird, wenn Sie bereits eine Entität mit derselben ID haben und jemand versucht, eine neue (neue Information) mit derselben ID einzufügen.

Es sieht so aus, als hätten Sie sich bereits entschieden:Sie möchten die Aktion abbrechen.

Das ist irgendwie ungewöhnlich, denn wenn Sie einige neue Daten von Clients dieser API über eine Entität erhalten, die bereits in Ihrer Datenbank vorhanden ist -> sieht das eher nach einem Update aus.

Es gibt einige Bibliotheken, die etwas Ähnliches können:https://github.com/borisdj/EFCore.BulkExtensions (der derzeit nur mit MsSQL funktioniert)

Verwendung dieser Bibliothek (die bekannt ist und von Microsoft bereits als EF Core Tool erwähnt wurde:https://docs.microsoft.com/en-us/ef/core/extensions/ ) haben Sie die Möglichkeit:

  • Alle Daten (alle Spalten) einfügen oder aktualisieren, wenn Sie eine Entität mit derselben ID finden (Upsert):

    context.BulkInsertOrUpdateAsync(entitiesList);

  • Synchronisieren Sie Entitäten aus Ihrer Datenbank mit allen Entitäten, die Sie von Kunden erhalten:

    context.BulkInsertOrUpdateOrDeleteAsync(entitiesList);

Höchstwahrscheinlich werden Sie für Ihren Fall nichts bereits implementiertes finden, aber Sie können diese Bibliothek anpassen mit:

BulkInsertOrDropAsync 

Was so etwas tun wird:

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) 

Das ist nicht wirklich ein DROP, aber es lässt Ihre Daten intakt.