Dosier-DB-Befehle in Entity Framework 4.0
Mein Aktuelles Projekt erfordert tägliche Synchronisation mit externen system. Die Synchronisation basiert auf komplexen import-Datei-Struktur, die analysiert und verarbeitet, mit umfangreichen business-Logik. Aufgrund der business-Logik haben wir beschlossen, diese in .NET-code und die Wiederverwendung der vorhandenen BL-Komponenten anstelle von schreiben der gleichen Logik in stored procedures oder integration services.
Die BL-Schicht befindet sich oberhalb von EF 4.0 data access layer. Die aktuelle Implementierung der import-batch, erfüllt alle änderungen in ObjectContext und führt SaveChanges in der Transaktion. Wenn ich den SQL profiler sehe ich, dass EF führt jede Entität ändern, wie einzelne SQL-Befehl (mit einem eigenen hin-und Rückreise zum DB). Außerdem sieht es aus wie diese Befehle ausgeführt werden voll sequenziell. 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 batch-insert/update/delete-Befehle irgendwie von EF selbst oder durch einen Anbieter /- Erweiterung?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nein, es kann nicht getan werden (ja - ich Weine auch).
EF nicht unterstützt batch-Operationen, LINQ-SQL hatte (hat) das gleiche problem.
Du hast ein paar Optionen:
Ich gegangen bin, mit option 1 und 3 in der Vergangenheit.
Das problem mit allen drei Ansätzen ist, verlieren Sie das EF-Abstraktion, die interne Grafik (vollständige Parallelität), und Ihr wieder in die Welt von native SQL.
Sich bewusst sein, von diese Projekt: magiq.codeplex.com
Bringt es batch-Operationen zu linq-to-sql und arbeiten wir in Entity Framework unterstützt mittlerweile.
Cheers
Es gibt einige Problemumgehungen, die in SQL Server:
Batch-Inserts sind beschrieben in der Entity Framework Bulk-Kopieren Artikel
Batch-Updates (und Löscht) sind beschrieben in der Mehrere entity-updates mit Entity Framework – EF Fetch Updates Artikel.
Falls Sie daran interessiert sind, Oracle, MySQL, POstgreSQL, oder SQLite verwenden, können Sie die neueste Red Lizard dotConnect Anbieter. Die BatchUpdates Funktionalität ist bereits integriert in die SaveChanges-Methode in den neuesten Versionen von diesen Anbietern.
Hier ist ein Weg, dass Sie Ihren code zunächst POCOs und ist schnell. Beschleunigt eine bulk insert-aus > 1 Stunde ~5 Sekunden.
SqlBulkCopy für Generische Liste (nützlich für das Entity Framework & NHibernate).
Nur gemeinsam mit Ihnen ein GitHub-Projekt nur für Sie, dass jetzt, es unterstützt Bulk-insert/update/delete bei Sql-server-transparent mit SqlBulkCopy.
https://github.com/MHanafy/EntityExtensions
Es sind andere goodies, und Es wird hoffentlich verlängert werden, mehr zu tun auf der Strecke.
Es ist so einfach wie
Hoffe, es hilft!