Wie andere Leute gesagt haben, ist SqlBulkCopy der Weg, es zu tun, wenn Sie wirklich gute Leistung einfügen möchten.
Die Implementierung ist etwas mühsam, aber es gibt Bibliotheken, die Ihnen dabei helfen können. Es gibt ein paar da draußen, aber ich werde schamlosplug meine eigene Bibliothek dieses Mal: https://github.com/MikaelEliasson/EntityFramework.Utilities#batch-insert-entities
Der einzige Code, den Sie benötigen, ist:
using (var db = new YourDbContext())
{
EFBatchOperation.For(db, db.BlogPosts).InsertAll(list);
}
Wie viel schneller ist es denn? Das ist schwer zu sagen, weil es von so vielen Faktoren abhängt: Computerleistung, Netzwerk, Objektgröße usw. usw. Die Leistungstests, die ich durchgeführt habe, deuten darauf hin, dass 25k Entitäten mit etwa 10s der Zeit eingefügt werden können. Standardmethode auf localhost, WENN Sie Ihre EF-Konfiguration wie in den anderen Antworten beschrieben optimieren. Mit EFUtilities dauert das etwa 300ms. Noch interessanter ist, dass ich mit dieser Methode etwa 3 Millionen Entitäten in weniger als 15 Sekunden gespeichert habe, im Durchschnitt etwa 200k Entitäten pro Sekunde.
Das einzige Problem ist natürlich, wenn Sie relevante Daten einfügen müssen. Dies kann effizient in Sql Server mit der obigen Methode getan werden, aber es erfordert Sie eine Id-Generierung-Strategie, die Sie Id's in der App-Code für die übergeordnete generieren lassen, so dass Sie die Fremdschlüssel festlegen können. Dies kann mit GUIDs oder etwas wie HiLo id Generation getan werden.
2 Stimmen
Wie machen Sie es derzeit?
1 Stimmen
Erstellen des TransactionScope, Instanziierung des DBContext, Öffnen der Verbindung, und in einer for-each-Anweisung die Einfügungen und SavingChanges (für jeden Datensatz), HINWEIS: TransactionScope und DBContext sind in using-Anweisungen, und ich schließe die Verbindung in einem finally-Block
1 Stimmen
Eine weitere Antwort als Referenz: stackoverflow.com/questions/5798646/
1 Stimmen
Wenn Sie AutoDetectChangesEnabled auf false setzen, könnte sich dies negativ auf Anwendungen auswirken, die stark von Steuerelementen von Drittanbietern abhängen. Das sollten Sie bedenken, bevor Sie überstürzt handeln und andere Teile der Anwendung beschädigen.
1 Stimmen
Tolle Lösungen können hier für eine der grundlegenden Web-Aufgaben gesehen werden - Persistieren eines Arrays von Zeilen mit data.... Erstaunliches Framework...
4 Stimmen
Die schnellste Art des Einfügens in eine SQL-Datenbank betrifft nicht EF. AFAIK Its BCP then TVP+Merge/insert.
6 Stimmen
Für diejenigen, die Kommentare lesen werden: Höchst zutreffend, modern 回答 ist hier.
1 Stimmen
Schauen Sie hier ben-morris.com/optimising-bulk-inserts-with-entity-framework-6 außerdem