2009-04-07 6 views
1

Ich habe eine Service-Level-Methoden, die einige Änderungen an der Datenbank vornehmen, und ich möchte, dass sie Transaktionssteuerung verwenden. Solche Verfahren können Folgendes tun: - LINQ SubmitChanges() Funktionalität - Anrufe zu StoredProceduresTransactionScope, LINQ und seltsame Transaktion Manager Problem (HRESULT: 0x8004D024)

Component Benutzer größer solcher elementaren Operationen in etwas gesetzt kombinieren.

Ich sehe, dass es schön Klasse TransactinScope ist und versucht, es zu verwenden:

using (TransactionScope transaction = new TransactionScope()) 
{ 
    content = repository.CreateBaseContent(content); 
    result = repository.CreateTreeRelation(content, parent.Id, name); 
    transaction.Complete(); 
} 

public baseContent CreateBaseContent(baseContent content) 
{ 
     EntityContext.baseContents.InsertOnSubmit(content); 
     EntityContext.SubmitChanges(); 

     return content; 
} 

public CreateTreeRelation (params) 
{ 
// do StoredProcedure call here via LINQ 
} 

Meine Vermutung war, dass auf äußere Schichten wäre es möglich, eine weitere Ebene der Transaktionsbereich hinzuzufügen. Stattdessen habe ich folgende Fehlermeldung:

Der Transaktionsmanager hat die Unterstützung für Remote-/Netzwerktransaktionen deaktiviert. (Ausnahme von HRESULT: 0x8004D024)

Ich benutze die gleiche (Vista Ultimate) Maschine für MS SQL 2005 und Microsoft-Entwicklungsserver. Von Komponententests funktioniert alles gut. Gleiches, wenn TransactionScope kommentiert wurde.

Ich habe versucht, mit Sicherheit für DTC (http://support.microsoft.com/kb/899191) und zu spielen, wenn ich alle eingehenden und ausgehenden Transaktionen acccept gesetzt, ich habe folgende Fehlermeldung:

Fehler HRESULT E_FAIL von einem Aufruf einer COM zurückgegeben wurde Komponente.

Während debug, entdeckte ich, dass in SubmitChanges, Linq Entity Context Objekt hat eine Transaktion ist NULL (!!) und System.Transactions.Transaction.Current hat offene Transaktion

Antwort

2

Ausgabe geschah, weil Linq Datacontext vor Transaction erstellt wurde .

Lösung war, eigene Transaktionssteuerung LINQ Datenkontext hinzuzufügen.

Connection.Open() 
Transaction = Connection.BeginTransaction(); 

und Leistungsindikatoren, um verschachtelte Aufrufe zu verwalten.

3

Ich denke, Sie können auch TransactionScope verwenden, solange Sie die Datenkontexte die gleiche Verbindung übergeben. Öffnen.

Ein weiteres Problem, das Sie mit TransactionScope bekommen, ist, dass es egal ist, ob die Verbindungszeichenfolge die gleiche ist und eine Sekunde dauert. Open wird die Transaktion auf eine verteilte Transaktion erhöhen. Und dann müssen Sie sich mit der zugehörigen Konfiguration und der Tatsache, dass es nicht die Light-Transaktion verwendet, die für diesen Fall benötigt wird, befassen.

Verwandte Themen