sql >> Databasteknik >  >> RDS >> Mysql

Ignorera dubblettposter och begå framgångsrika på DbContext.SaveChanges() i EF Core

Det verkar som att du har ett affärsproblem. Först måste du bestämma vad som ska hända när du redan har en enhet med samma id på plats och någon försöker infoga en ny (ny information) med samma id.

Det verkar som att du redan har bestämt dig:Du vill avbryta handlingen.

Det är på något sätt ovanligt eftersom om du får lite ny data från klienter till det API:et om en enhet som redan fanns i din databas -> så ser det mer ut som en uppdatering.

Det finns några bibliotek som kan göra något liknande:https://github.com/borisdj/EFCore.BulkExtensions (som för närvarande bara fungerar med MsSQL)

Genom att använda detta bibliotek (som är ett känt och redan nämnts av Microsoft som ett EF Core Tool:https://docs.microsoft.com/en-us/ef/core/extensions/ ) har du möjlighet att:

  • Infoga eller uppdatera all data (alla kolumner) om du hittar en enhet med samma id (Upsert):

    context.BulkInsertOrUpdateAsync(entitiesList);

  • Synkronisera enheter från din databas med vilka enheter du får från klienter:

    context.BulkInsertOrUpdateOrDeleteAsync(entitiesList);

Troligtvis kommer du inte att hitta något som redan är implementerat för ditt fall men du kan justera det här biblioteket med:

BulkInsertOrDropAsync 

Vilket gör något i stil med:

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) 

Vilket egentligen inte är en DROP, men det kommer att lämna dina data intakta.




  1. Sortera efter kolumn ASC, men NULL-värden först?

  2. Implementering av fel- och transaktionshantering i SQL Server

  3. Någon har hackat min databas – hur?

  4. postgresql migrerar JSON till JSONB