Ich habe ein Nuget-Paket (SqlBulkTools) veröffentlicht, um dieses Problem zu lösen.
Hier ist ein Codebeispiel, das eine Massen-Upsert erreichen würde.
var bulk = new BulkOperations();
var books = GetBooks();
using (TransactionScope trans = new TransactionScope())
{
using (SqlConnection conn = new SqlConnection(ConfigurationManager
.ConnectionStrings["SqlBulkToolsTest"].ConnectionString))
{
bulk.Setup<Book>()
.ForCollection(books)
.WithTable("Books")
.AddAllColumns()
.BulkInsertOrUpdate()
.MatchTargetOn(x => x.ISBN)
.Commit(conn);
}
trans.Complete();
}
Für sehr große Tabellen gibt es Optionen zum Hinzufügen von Tabellensperren und zum vorübergehenden Deaktivieren von nicht gruppierten Indizes. Weitere Beispiele finden Sie in der SqlBulkTools-Dokumentation.