14

Mein aktuelles Projekt erfordert eine tägliche Synchronisation mit einem externen System. Die Synchronisation basiert auf einer komplexen Importdateistruktur, die mit umfangreicher Geschäftslogik analysiert und verarbeitet wird. Aufgrund der Geschäftslogik haben wir uns dazu entschieden, dies in .NET-Code zu machen und vorhandene BL-Komponenten wiederzuverwenden, anstatt dieselbe Logik in gespeicherten Prozeduren oder Integrationsdiensten zu schreiben.Batch-DB-Befehle in Entity Framework 4.0

Die BL-Schicht befindet sich auf der EF 4.0-Datenzugriffsebene. Die aktuelle Implementierung verarbeitet den Import-Batch, füllt alle Änderungen in ObjectContext und führt SaveChanges in der Transaktion aus. Wenn ich SQL Profiler überprüfe, sehe ich, dass EF jede Änderung der Entität als einzelner SQL-Befehl ausführt (mit eigenem Umlauf in DB). Außerdem sieht es so aus, als würden diese Befehle vollständig sequentiell ausgeführt. So habe ich bis zu 100.000 Roundtrips zur Datenbank für den ersten Import und zwischen 10.000 - 50.000 Roundtrips zur Datenbank für die tägliche Synchronisation.

Ist es möglich, Kommandos irgendwie durch EF selbst oder durch irgendeinen Provider/eine Erweiterung einzufügen/zu aktualisieren/zu löschen?

Antwort

8

Nein, es kann nicht getan werden (ja - ich weine auch).

EF unterstützt keine Batch-Operationen, LINQ-SQL hatte (hat) das gleiche Problem.

Sie haben ein paar Optionen bekam:

  1. Stored Procedures
  2. Klassische ADO.NET oder EntitySQL
  3. Trigger

Ich habe in der mit Option 1 und 3 gegangen Vergangenheit.

Das Problem mit allen drei Ansätze ist, verlieren Sie die EF-Abstraktion, die interne Grafik (optimistische Nebenläufigkeit), und Ihre zurück in die Welt der nativen SQL gebracht.

+0

Also werde ich mit meiner aktuellen Lösung leben, weil das Umschreiben der Lösung keine Option ist. :( –

+2

Yep. EF ist nicht für Batch-Arbeit konzipiert. Und vor allem so etwas wie eine "Import-Batch" - ist eine Datenbank-Problem, nicht ein ORM Anliegen. Ich würde nicht einmal EF dafür verwenden, würde ich eine haben seperater Dienst (zB WCF - gehostet als Windows - Dienst), dessen alleinige Verantwortung es wäre, diese Massendaten zu importieren, wenn eine Synchronisation erforderlich ist .. mein vorheriges Projekt erforderte auch das Synchronisieren von db's mit unserem und externem Windows Dienst (vor dem wcf – RPM1984

3

Schreiben dieses Projekts bewusst: magiq.codeplex.com

Es Batch-Operationen bringt Linq to SQL und wir arbeiten jetzt in EntityFramework Unterstützung.

Prost

+0

Das ist eine gute Nachricht, danke, –

+0

Das letzte Commit für dieses Projekt war am 1. Oktober 2012 :( –

3

Es gibt einige Workarounds in SQL Server:

Falls Sie interessiert sich für Oracle, MySQL, PostgreSQL oder SQLite, die neueste Devart dotConnect providers verwenden können. Die BatchUpdates functionality ist in den neuesten Versionen dieser Anbieter bereits in der SaveChanges-Methode integriert.

0

Nur mit Ihnen ein GitHub-Projekt nur für das, ab sofort unterstützt es Bulk einfügen/aktualisieren/löschen für Sql-Server transparent mit SqlBulkCopy. https://github.com/MHanafy/EntityExtensions Es gibt noch andere Leckerbissen, und hoffentlich wird es erweitert, um mehr auf der Strecke zu tun. Die Benutzung ist so einfach wie

var insertsAndupdates = new List<object>(); 
var deletes = new List<object>(); 
context.BulkUpdate(insertsAndupdates, deletes); 

Hoffe, es hilft!