我使用Entity Framework 4并在环境事务中执行存储过程时遇到以下问题。 这是代码:
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();
}
}
Context.ExecuteFunction<..>("AddOrderRequest",...)
feeDA.Save()
将实体添加到存储库并调用Context.SaveChanges()
The transaction operation cannot be performed because there are pending requests working on this transaction.
关键是我需要在一个事务中执行这两个操作,并且我不能使用Can't I call a stored procedure from Entity Framework inside a transaction scope?中建议的解决方法(ado.net使用自己的连接) 有谁知道如何在事务中包装DataContext.ExecuteFunction&lt;&gt;()?
P.S。我试图用自己的TransactionScope将ExecuteFunction包装在自己的事务中,并带有所有可能的参数(Supress等),但hothing帮助了。
答案 0 :(得分:3)
查看this other stackoverflow question中的类似问题,特别是在答案#4:
“我终于找到了一个解决方案......似乎EF期待存储过程 (导入函数)返回一个值。所以调用.FirstOrDefault() 它返回时的功能。“
如果这适用于您自己的问题,那么在您调用Context.ExecuteFunction的_storedProcedureDA.UpdateOrderRequest方法内部,获取返回值(可能是int)并将其返回给调用方法(因此将UpdateOrderRequest从void更改为int或任何返回值类型)。
我看到这个问题很老了,所以也许你很久以前就解决了这个问题并继续前进?