私は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();
}
}
- _StoredProceduresDAとFeeDAは毎のDataContextの1つのインスタンスを使用してデータ・アクセス・クラスです。
- _storedProcedureDA.UpdateOrderRequest()メソッドは、単に
Context.ExecuteFunction<..>("AddOrderRequest",...)
feeDA.Save()
下ラッパーでリポジトリにエンティティを追加し、私はこの呼び出しをしようとしたときContext.SaveChanges()
- を呼び出して、私は次の例外をキャッチ:
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など)でラップしようとしましたが、うまくいきませんでした。
データクラスがそれぞれ「別々のDataContextを使用する」か「単一のDataContextを共有する」かをさらに明確にすることができますか。あなたの "それぞれのDataContextの1つのインスタンス"は十分に具体的ではありません... –