2

データベースにほとんど変更を加えないサービスレベルのメソッドがあり、トランザクション制御を使用したいと考えています。このようなメソッドは、次のことを実行できます。 - LINQ SubmitChanges() 機能 - StoredProcedures の呼び出し

コンポーネントのユーザーは、このような基本操作のセットをより大きなものに組み合わせることができます。

素晴らしいクラス TransactinScope があり、それを使用しようとしていることがわかります。

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
}

私の仮定は、外側のレイヤーでは、別のレベルのトランザクション スコープを追加できるというものでした。代わりに、次のエラーが発生しています。

トランザクション マネージャは、リモート/ネットワーク トランザクションのサポートを無効にしました。(HRESULT からの例外: 0x8004D024)

MS SQL 2005 と Microsoft 開発サーバーに同じ (Vista Ultimate) マシンを使用しています。単体テストから、すべて正常に動作します。TransactionScope がコメントしたときも同じです。

DTC ( http://support.microsoft.com/kb/899191 ) のセキュリティを試してみましたが、すべての受信および送信トランザクションを受け入れるように設定すると、次のエラー メッセージが表示されます。

COM コンポーネントへの呼び出しからエラー HRESULT E_FAIL が返されました。

デバッグ中に、SubmitChanges で、Linq Entity Context に Property Transaction IS NULL(!!) があり、System.Transactions.Transaction.Current にトランザクションが開いていることがわかりました。

4

2 に答える 2

2

トランザクション スコープの前に Linq Datacontext が作成されたため、問題が発生しました。

解決策は、独自のトランザクション コントロールを LINQ データ コンテキストに追加することでした。

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

入れ子になった呼び出しを維持するためのカウンター。

于 2009-04-08T13:00:24.277 に答える