2017-08-24 4 views
0

Ich brauche eine Transaktion wie unten auszuführen:EF6 Lesen unbestätigten Daten

  1. Transaktion Start: Hier nenne ich context.Database.BeginTransaction() (bitte beachten Sie die context hier ist nicht das gleiche unten in der Frage, wo ich nicht gebundenen lesen wollen)
  2. Speichern Sie einen Kontakt (mit einer gespeicherten Prozedur): Dieser USP hat auch eine Transaktion.
  3. einige andere Datensätze erstellen auf dem Kontakt Basis (done Seite mit EF-Anwendung)
  4. Commit

Das Problem, das ich in laufen lasse, ist, dass in Schritt 3, ich brauche einige Daten aus der Datenbank zu lesen, wurde noch nicht festgelegt (ab Schritt 2). Ich habe versucht, dies zu tun, aber es funktioniert nicht:

context.Database.ExecuteSqlCommand("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;"); 
var contact = context.Contact.SingleOrDefault(x => x.ContactId == intId); 
context.Database.ExecuteSqlCommand("SET TRANSACTION ISOLATION LEVEL READ COMMITTED;"); 

ich den Debugger laufen habe und Pause an dem Punkt, wo die contact geholt wird, aber nichts zurückgegeben.

Wenn ich für denselben Datensatz abfragen in SSMS (SQL Server mgmt Studio), gibt es Ergebnis:

set transaction isolation level read uncommitted 
select * from Contact c where c.ContactId = 9999 

Fragen

  1. Wie kann ich nicht festgeschriebenen Daten mit EF6 lesen? Einige Online-Suchen führen mich dazu, einen benutzerdefinierten Interceptor zu erstellen, aber muss ich das wirklich?
  2. Viele Artikel schlagen vor, nicht festgeschriebene Daten zu lesen, aber ich denke nicht an einen anderen Weg, dies zu erreichen. Ist da?
+0

Was eigentlich ist der Schritt 1? Wenn Sie 'var tr = context.Database.BeginTransaction();' ausführen, sollten die zukünftigen Operationen, die denselben 'Kontext' verwenden, die nicht festgeschriebenen Änderungen in dieser Transaktion sehen. –

+0

@IvanStoev es ist einfach 'this.context.Database.BeginTransaction();' aber das ist nicht der gleiche Kontext wie der in der Frage. – CodingYoshi

+0

Ich sehe. Dann versuchen Sie 'BeginTransaction (System.Data.IsolationLevel.ReadUncommitted)', es scheint zu funktionieren (Schnelltest). –

Antwort

0

Sie können Ihre Datenbank-Zugriffscode in einem TransactionScope, wie so versuchen Verpackung:

using (var scope = new TransactionScope(TransactionScopeOption.Required, 
       new TransactionOptions() { IsolationLevel = IsolationLevel.ReadUncommitted })) 

Wie werden Sie Ihre Transaktion zu beginnen? Ich frage, denn wenn der Code-Flow so ist, wie Sie es beschrieben haben, sollten alle Operationen in den Schritten 2 und 3 innerhalb der gleichen Transaktion ausgeführt werden und diese Transaktion sollte in der Lage sein, Änderungen zu sehen, die von früheren Operationen innerhalb derselben Transaktion gemacht wurden.

Sie können auch versuchen, SQL Server Profiler zu verwenden, um die Datenbankinteraktion zu überwachen und festzustellen, ob zusätzliche (neue) Transaktionen erstellt werden.

Es könnte helfen, wenn Sie den eigentlichen Code geschrieben, die Schritte 1 bis 4. tut

+0

Ich habe meine Frage bearbeitet und ja es gibt noch andere Transaktionen. – CodingYoshi