SqlBulkCopy Mehrere Tabellen Einfügen unter Einzeltransaktion ODER Masseninsertoperation zwischen Entity Framework und Classic Ado.net

8

Ich habe zwei Tabellen, die eingefügt werden müssen, wenn meine Anwendung ausgeführt wird.
Nehmen wir an, ich habe Tabellen wie folgt

  • tbl_FirstTable und tbl_SecondTable

Mein Problem ist das Datenvolumen.
Ich muss über 10.000 Zeilen zu tbl_FirstTable und über 500.000 Zeilen zu tbl_SecondTable einfügen.

Ich benutze das Entity Framework wie folgt.

%Vor%

Das ist der Ort, an dem ich mit dem Fehler Time out exception konfrontiert bin.
Ich denke, dass die Ausnahme gelöst wird, wenn ich den folgenden Code verwende.

%Vor%

Also habe ich es benutzt. Es hat gelöst, aber ich sehe einen anderen Fehler OutOfMemory Exception .
Also habe ich die Lösungen gesucht, zum Glück habe ich unten Artikel gefunden.

  1. Problem mit der Masseneinfügung mit Entity Framework
  2. Verwenden von Transaktionen mit SqlBulkCopy
  3. Durchführen einer Massenkopieroperation in einer Transaktion

Gemäß diesen Artikeln ändere ich meinen Code von Entity Framework in den klassischen ADO.net-Code.

%Vor%

Schließlich führt es den Einfügeprozess in weniger als 15 Sekunden für mehr als 500.000 Zeilen durch.

Es gibt zwei Gründe, warum ich dieses Szenario posten kann.

  1. Ich würde gerne teilen, was ich herausgefunden habe.
  2. Da ich nicht perfekt bin, muss ich immer noch mehr Vorschläge von dir bekommen.

Also, jede bessere Lösung wird geschätzt werden.

    
Frank Myat Thu 18.03.2013, 06:52
quelle

2 Antworten

0

Haben Sie versucht, AutoDetectChangesEnabled = false in der Context.Configuration vor allen Einfügungen zu setzen?

    
Thabo 18.03.2013 07:09
quelle
0

1) Verwenden Sie EF6.x, das eine viel bessere Leistung als EF5.x

hat

Hier finden Sie weitere Vorschläge (aus Masseneinfügung mit EF )

2) Halten Sie das aktive Kontextdiagramm klein, indem Sie für jede Arbeitseinheit einen neuen Kontext verwenden

3) Deaktivieren Sie AutoDetechChangesEnabled - context.Configuration.AutoDetectChangesEnabled = false;

4) Batching, in Ihrer Schleife, rufen Sie regelmäßig SaveChanges auf

    
Carl Prothman 17.05.2015 21:42
quelle