2010-03-22 12 views
13

Mögliche Duplizieren zu sperren:
Entity Framework with NOLOCKWie Entity Framework zwingen die Datenbank nicht

Ich verwende EF4 und .Net 4 zu laden einige XML aus einer Datei in eine Datenbank .

Ich habe eine Klasse die Wraps um den ObjectContext und hat Methoden, die die Marshalled-Objekte aus der XML-Datei zu den verschiedenen EntityCollections hinzufügen, die meine Tabellen darstellen.

Jede XML-Datei enthält durchschnittlich etwa 200.000 Objekte. Die Wrapper-Klasse erstellt den ObjectContext on construction und speichert den Verweis in einer lokalen privaten Klassenvariablen, die dann von den Methoden verwendet wird.

Als ich fertig haben die Entitäten zu schaffen Ich nenne:

entities.SaveChanges(SaveOptions.AcceptAllChangesAfterSave); 

Dies schafft eine Transaktion auf dem Server, der als pro EntityFramework Design. Diese Transaktion schließt jedoch meine Datenbank vollständig ab, selbst wenn Tabellen nicht hinzugefügt werden.

Ich habe verschiedene Dinge ausprobiert, um diese einschließlich Verpackung speichern Sie die Änderungen in einer Transaction so zu versuchen und zu erhalten:

using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Suppress, 
     new TransactionOptions { IsolationLevel = IsolationLevel.ReadUncommitted })) 
     { 
      entities.SaveChanges(SaveOptions.AcceptAllChangesAfterSave); 

      transaction.Complete(); 
     } 

ich auch die Transaction versucht habe, zu schaffen, bevor das Object in einem Versuch, die Schaffung des zugrunde liegenden zu beeinflussen Transaktion wird während SaveChanges verwendet.

Idealerweise würde ich mehrere Dateien gleichzeitig laden wollen, aber dies ist unmöglich, wenn die Datenbank während der Speicheränderungen gesperrt ist.

Kennt jemand eine Arbeit um dieses Problem? Gibt es einen Weg, um den EntityFramework zu zwingen, keine Transaktion zu verwenden?

Vielen Dank für jede Hilfe im Voraus.

James

+0

Ich denke, das Problem hier ist, dass Sie TransactionScopeOption.Supress verwenden. Versuchen Sie es mit Erforderlich. –

Antwort

13

Genau dies dem zu Bett gehen im setzen zu schreiben, was meine Lösung war.

Ich war im Grunde aus dem falschen Ende des Problems bei dieser Suche wird eine Transaktion verwendet, wenn SaveChanges() Aufruf Sie können jedoch nach wie vor die Datenbank unter Verwendung eines Verfahrens wie folgt lesen:

private static FrameEntities GetEntities() 
    { 
     FrameEntities entities = new FrameEntities(); 
     entities.ExecuteStoreCommand("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;"); 
     return entities; 
    } 

Hier wird die Isolation bevor Sie versuchen zu lesen.

Dies wird normalerweise nicht empfohlen, da Sie "dreckig" von Teildaten lesen können, aber für was es geht.

+3

Dies funktioniert nicht. Das Festlegen der Transaktionsisolationsstufe allein hat keine Auswirkungen. Sie müssen tatsächlich innerhalb einer Transaktion ausgeführt werden, damit sie wirksam wird. Die MSDN-Dokumentation für READ UNCOMMITTED-Status Transaktionen, die auf der Ebene READ UNCOMMITTED ausgeführt werden, geben keine freigegebenen Sperren aus. Dies bedeutet, dass Sie innerhalb einer Transaktion ausgeführt werden müssen, um den Vorteil zu erhalten. (übernommen von msdn.microsoft.com/de-de/library/ms173763.aspx).Ihr Ansatz mag weniger aufdringlich sein, aber es wird nichts erreichen, wenn Sie keine Transaktion verwenden. –

Verwandte Themen