sql >> Database >  >> RDS >> Mysql

Negeer dubbele vermeldingen en leg succesvolle vast in DbContext.SaveChanges() in EF Core

Het lijkt erop dat u een zakelijk probleem heeft. Eerst moet je beslissen wat er zal gebeuren als je al een entiteit hebt met dezelfde id en iemand probeert een nieuwe in te voegen (nieuwe informatie) met dezelfde id.

Het lijkt erop dat je al hebt besloten:je wilt de actie laten vallen.

Dat is op de een of andere manier ongebruikelijk, want als je nieuwe gegevens van klanten van die API ontvangt over een entiteit die al in je database bestond -> dat lijkt meer op een update.

Er zijn enkele bibliotheken die iets soortgelijks kunnen doen:https://github.com/borisdj/EFCore.BulkExtensions (die momenteel alleen met MsSQL werkt)

Gebruik van deze bibliotheek (die bekend is en al door Microsoft werd genoemd als een EF Core Tool:https://docs.microsoft.com/en-us/ef/core/extensions/ ) heeft u de mogelijkheid om:

  • Voeg alle gegevens (alle kolommen) in of werk deze bij als u een entiteit vindt met dezelfde id (Upsert):

    context.BulkInsertOrUpdateAsync(entitiesList);

  • Synchroniseer entiteiten uit uw database met alle entiteiten die u van klanten ontvangt:

    context.BulkInsertOrUpdateOrDeleteAsync(entitiesList);

Hoogstwaarschijnlijk zult u niet iets vinden dat al voor uw zaak is geïmplementeerd, maar u kunt deze bibliotheek aanpassen met:

BulkInsertOrDropAsync 

Wat zoiets zal doen als:

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) 

Wat niet echt een DROP is, maar het laat je gegevens intact.




  1. SQL:rijen selecteren waar de kolomwaarde is gewijzigd ten opzichte van de vorige rij

  2. OpenSSL - fout 18 bij 0 diepte opzoeken:zelfondertekend certificaat

  3. Hoeveel significante cijfers moet ik in mijn database opslaan voor een GPS-coördinaat?

  4. Een opgeslagen procedure maken in MySQL5 met ColdFusion 9's <CFQUERY>-Tag