2015-12-04 3 views
7

Erstellen einer Datenzugriffsebene für eine interne Unternehmens-MVC-Anwendung mit Entity Framework und dem Repository-Muster. In einigen Fällen muss ich beispielsweise 100.000 Zeilen in einer Tabelle mit 100 Millionen Zeilen in einer SQL Server 2008 R2-Datenbank aktualisieren.Kann Entity Framework eine UPDATE ... WHERE-Anweisung in SQL generieren?

Ich verwende EF6, das auf eine bestehende Datenbank abzielt, die wir refaktorisieren. Ich bin neu in Entity Framework, habe aber viel Erfahrung mit SQL Server.

Egal wie ich meine Update-Anweisung zu strukturieren scheint, wenn ich einen Profiler ausführe, sehe ich 60k individuelle Updates nach ID. Dies kann bis zu 5 Minuten dauern. Ich habe jedoch eine "Chargennummer" angegeben, die für eine Reihe dieser Datensätze indiziert ist. Gibt es einen Weg zu UPDATE diese Datensätze mit einer einzigen WHERE-Klausel aus EF generiert? Meine Lösung war, einfach eine einfache SP zu schreiben, die ich dann EF-Aufruf habe.

+1

EntityFramework führt keine Stapeloperationen durch. Jede Operation ist eine Operation in der Datenbank pro Datensatz (wie Sie festgestellt haben) Sie können entweder Ihre eigene SQL-Anweisung über EntityFramework schreiben und ausführen oder eine gespeicherte Prozedur aufrufen und die entsprechenden Parameter über EntityFramework übergeben. – Tommy

+0

Nach meiner Erfahrung würde ich mit einem SP für solche "große" Operationen gehen. –

+1

Die aktuellen EF v6-Versionen unterstützen keine Batch-Vorgänge - aber das EF-Team arbeitet hart an EF v7 und * unterstützt schließlich Batch-Operationen. Vorerst müssen Sie entweder auf Ihre eigenen Lösungen zurückgreifen oder sich Lösungen von Drittanbietern wie [EntityFramework.Extended] (https://github.com/loresoft/EntityFramework.Extended) ansehen. –

Antwort

4

Entity Framework in seiner aktuellen Version unterstützt keine Bulk-Operationen in dem Sinne, dass Sie es wollen. Jede Aktualisierung oder Löschung ist eine einzelne Transaktion pro Datensatz. Um dies zu vermeiden, können Sie SQL direkt von Entity Framework ausführen, wenn Sie möchten, gehen Sie nicht durch lästiges Erstellen einer gespeicherten Prozedur (obwohl, sind sie recht einfach aufstehen und gehen)

using (var context = new MyDbContext()) 
{ 
    context.ExecuteStoreCommand("Update MyTable Set Value = {0} Where SomeColumn = {1}", 
           updateValue, queryValue); 
    context.ExecuteStoreCommand("Delete From MyTable Where value = {0}", 
           myValueToQueryBy); 
} 

Beachten Sie die Verwendung des Parameters durch Verwendung einer Syntax, die einer string.Format() sehr ähnlich sieht. Weitere Informationen finden Sie unter MSDN.

+0

Vielen Dank. Mein Instinkt lässt mich vor SQL-Text in meinen .cs-Dateien zurückschrecken, aber ich verstehe das Konzept. Ich mache es im Grunde genommen zur nächsten Übung, wenn wir Entity-Framework verwenden, um immer eine gespeicherte Prozedur zu verwenden, wenn mehrere Zeilen auf den bekannten "großen" Tabellen aktualisiert werden. Ich habe ein generisches Datenrepositorymuster und für "TableA" füge ich eine neue Methode hinzu, um die gespeicherte Prozedur in die Klasse "TableARepository" aufzurufen. – jkerak

Verwandte Themen