Ich habe eine kleine SQL CE 4.0 Datenbank mit mehreren Tabellen, die mit Entity Framework 4 gemappt sind.
Hier ist der Code, den ich habe
%Vor% Dieser Code passiert 24 times
und jedes Mal, wenn die newItemDesignations
-Liste exactly 525 elements
enthält. Das sind insgesamt 12600 Zeilen zum Hinzufügen.
Der vollständige Prozess dauert 509 seconds
. Ich denke, das ist zu viel für 12600
rows.
Ich bin mir bewusst, dass ich SaveChanges 24 times
anrufe. Im Moment erlaubt mir das Anwendungsdesign nicht, alle Beilagen in eine einzige Transaktion zu stellen (mit SaveChanges
). Sehen Sie sich jedoch an, was mit der einzelnen Transaktion passiert. 509 / 24 = 21 seconds
oder eine 40 ms per row
.
Ich habe meinen anderen Code überprüft (außer das Hinzufügen zur Datenbank und das Speichern von Änderungen). Es dauert insgesamt 100 ms für alle 12600 Zeilen. Das sind 0,01% der gesamten Zeit, das ist natürlich nicht das Problem. Die 99,99% der Verarbeitungszeit werden in EF4 AddObject
und SaveChanges
verbracht.
Ich bin mir auch bewusst, dass ich die ItemID Eigenschaft, die ein Fremdschlüssel ist, setze. Dies ist eine ganze Zahl, also denke ich, es sollte nicht viel ausmachen. Aber ich würde es nicht wissen.
Beachten Sie auch: Es gibt keine Indizes für eine der Tabellen (außer für primäre / Fremdschlüssel)
Da die Beispiele knapp sind, hier ist der Code, den ich getestet habe und es funktionierte einwandfrei. Danke an ErikEJ's SqlCeBulkCopy
library. Ein Muss.
Das Einfügen meiner (OP) 12600 Zeilen dauerte weniger als 2 Sekunden.
Dieses Beispiel ist schlecht, es ist nicht stark typisiert, aber es beschreibt, wie man eine Datentabelle manuell erstellt und sie mit SqlCeBulkCopy
library in eine Datenbank einfügt (siehe akzeptierte Antwort für einen Link) .
Um die Antwort von ErikEJ und Ihr eigenes Beispiel weiter zu verbessern, können Sie die Implementierung von IDataReader
über Listen verwenden, um die Daten in WriteToServer
zu streamen, statt die Werte über ein DataTable
zu duplizieren. Siehe diese Frage:
Erhalte einen IDataReader aus einer typisierten Liste
Ich habe dies bei der Arbeit einmal implementiert, es scheint die Performance nicht zu verbessern, aber es scheint den Speicherverbrauch zu reduzieren.
Tags und Links c# database entity-framework-4 insert sql-server-ce