在Entity Framework中调用TransactionScope内的存储过程

时间:2010-11-24 17:42:36

标签: .net stored-procedures entity-framework-4

我使用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();
    }
}
  1. _StoredProceduresDA和FeeDA是数据访问类,每个类使用一个DataContext实例。
  2. _storedProcedureDA.UpdateOrderRequest()方法只是Context.ExecuteFunction<..>("AddOrderRequest",...)
  3. 下的包装器
  4. feeDA.Save()将实体添加到存储库并调用Context.SaveChanges()
  5. 当我尝试拨打此电话时,我会发现以下异常: The transaction operation cannot be performed because there are pending requests working on this transaction.
  6. 关键是我需要在一个事务中执行这两个操作,并且我不能使用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帮助了。

1 个答案:

答案 0 :(得分:3)

查看this other stackoverflow question中的类似问题,特别是在答案#4:

  

“我终于找到了一个解决方案......似乎EF期待存储过程   (导入函数)返回一个值。所以调用.FirstOrDefault()   它返回时的功能。“

如果这适用于您自己的问题,那么在您调用Context.ExecuteFunction的_storedProcedureDA.UpdateOrderRequest方法内部,获取返回值(可能是int)并将其返回给调用方法(因此将UpdateOrderRequest从void更改为int或任何返回值类型)。

我看到这个问题很老了,所以也许你很久以前就解决了这个问题并继续前进?