Noch vor einiger Zeit wurde man, ohne BulkInsert, zu einer vorzeitigen Mittagspause gezwungen, wenn man tausende oder sogar mehrere Millionen Datensätze in die Datenbank importieren musste.
Dank dem Entity Framework kann eine Datenbank einfach erstellt werden, aber auch Daten simpel importiert werden. Aber simpel bedeutet eben auch nicht schnell.
using (var db = new CityContext()){ foreach(var city in Cities){ db.Cities.Add(city); } db.SaveChanges(); }
Wobei erwähnt werden muss, dass nicht das Entity Framework selber das Problem ist, vielmehr sind es die Voreinstellungen, welche den Import Prozess verzögern. Mit der Voreinstellung wird pro Datensatz, der in die Datenbank gespeichert werden muss, ein Insert Statement abgesetzt. Zusätzlich dazu wird von jeder einzelnen Klasse (also nach jedem einzelnen Insert) eine Sicherheitskopie in den Speicher gelegt, ChangeTracking sei Dank. Dass diese Lösung bei grossen Mengen von Daten nicht brauchbar ist, ist gut erkennbar.
Doch was gibt es für Alternativen. Eine Möglichkeit der Optimierung ist, das ChangeTracking, also das Nachverfolgen von Änderungen an der Klasse, zu verhindern. Mit folgender Zeile lässt sich das realisieren:
db.Configuration.AutoDetectChangesEnabled = false;
Diese kleine Änderung hat einen grossen Einfluss und die Mittagspause muss wohl wie ursprünglich geplant stattfinden.
Noch schnellere Importzeiten werden mit BulkInsert erreicht. Mehrere tausende Zeilen lassen sich mit einem Befehl in die Datenbank importieren. Damit die vielen Annehmlichkeiten des EntityFramworks nicht verloren gehen, lässt sich der BulkInsert damit kombinieren. Dazu kann das NuGet Package EntityFramwork.BulkInsert installiert werden.
Grosser Pluspunkt dieser Variante ist, dass es sich um eine Erweiterung (Extension Methode) handelt und keine Vererbung notwendig ist. Dies hat auch zur Folge das bestehender Code trotzdem weiterhin funktioniert.
Nachfolgenden das zu verwendende Codestück:
using (var db = new CityContext()){ db.BulkInsert(cities); db.SaveChanges(); }
Und schon ist nur der Gedanke an eine Pause überflüssig, dank einer Lösung welche in Rekordzeit Millionen Datensätze in die Datenbank importiert. Zur Übersicht hier die Importzeiten der erwähnten Lösungen:
Import Art | Zeitbedarf |
Entity Framework ohne ChangeTracking | 30 Sekunden |
Entity Framework mit BulkInsert | 3 Sekunden |