2010-11-24 26 views
5

私はEntity Framework 4を使用しており、以下の問題を満たしています。ここ コードである:Entity FrameworkのTransactionScope内でストアドプロシージャを呼び出す

public void UpdateOrderRequest(IOrder order, int requestId, int userId, Fee fee) 
{ 
    using (var tscope = new TransactionScope(TransactionScopeOption.RequiresNew)) 
    { 
     _storedProcedureDA.UpdateOrderRequest(requestId, userId, data.ClientId, data.RequestStatus, data.Date, 
           data.Type, data.Side, data.Quantity, data.ExecInst, data.Price, 
           data.StopPrice, data.TimeInForce, data.Description, data.Target); 
     var feeDa = new FeeDA(); 
     var dbFee = new Domain.Entities.Fee 
         { 
          OrderRequestId = requestId, 
          Identifier = fee.Id, 
          Value = fee.Value, 
         }; 
     feeDa.Save(dbFee); 
     tscope.Complete(); 
    } 
} 
  1. _StoredProceduresDAとFeeDAは毎のDataContextの1つのインスタンスを使用してデータ・アクセス・クラスです。
  2. _storedProcedureDA.UpdateOrderRequest()メソッドは、単にContext.ExecuteFunction<..>("AddOrderRequest",...)
  3. feeDA.Save()下ラッパーでリポジトリにエンティティを追加し、私はこの呼び出しをしようとしたときContext.SaveChanges()
  4. を呼び出して、私は次の例外をキャッチ: The transaction operation cannot be performed because there are pending requests working on this transaction.

要点は、これらの操作を1つのトランザクションで行う必要があり、Can't I call a stored procedure from Entity Framework inside a transaction scope?(ado.netは独自の接続を使用)で提案された回避策を使用できないことです。 誰もトランザクションでDataContext.ExecuteFunction <>()をラップする方法を知っていますか?

P.S.私はExecuteFunctionを独自のTransactionScopeですべての可能なパラメータ(Supressなど)でラップしようとしましたが、うまくいきませんでした。

+0

データクラスがそれぞれ「別々のDataContextを使用する」か「単一のDataContextを共有する」かをさらに明確にすることができますか。あなたの "それぞれのDataContextの1つのインスタンス"は十分に具体的ではありません... –

答えて

3

は特に回答#4で、this other stackoverflow questionで同様の問題を見て:「私は最終的に解決策を見つけた

... EFは、ストアドプロシージャ (インポート機能)を返すように期待するようです値。 の.FirstOrDefault()を呼び出すと、関数が返されます。それはあなた自身の問題に適用されるなら、あなたはContext.ExecuteFunctionを呼び出すあなたの_storedProcedureDA.UpdateOrderRequest方法、の内部で、戻り値をつかむ(おそらくINT)と呼び出し元のメソッドにそれを返す

(そうUpdateOrderRequestを変更voidからintへ、または戻り値の型が何であっても)。

私はこの質問がかなり古くなっていることを知っています。

関連する問題