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

And*_*rny 5 .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();
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. _StoredProceduresDA和FeeDA是数据访问类,每个类使用一个DataContext实例.
  2. _storedProcedureDA.UpdateOrderRequest()方法只是包装下的 Context.ExecuteFunction<..>("AddOrderRequest",...)
  3. feeDA.Save() 将实体添加到Repository和调用中 Context.SaveChanges()
  4. 当我试图进行此调用时,我捕获以下异常: The transaction operation cannot be performed because there are pending requests working on this transaction.

关键是我需要在一个事务中执行这两个操作,并且我不能使用建议的解决方法我不能在事务范围内调用实体框架中的存储过程吗?(ado.net使用自己的连接)有谁知道如何在事务中包装DataContext.ExecuteFunction <>()?

PS我试图用自己的TransactionScope将ExecuteFunction包装在自己的事务中,并带有所有可能的参数(Supress等),但hothing帮助了.

Kir*_*iya 3

看看其他 stackoverflow 问题中的类似问题,特别是答案#4:

“我终于找到了一个解决方案......似乎 EF 期望存储过程(导入函数)返回一个值。因此在函数返回时调用 .FirstOrDefault() 。”

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

我发现这个问题已经很老了,所以也许你很久以前就解决了它并继续前进?