【问题标题】:Call stored procedure inside TransactionScope in Entity Framework在实体框架中调用 TransactionScope 内的存储过程
【发布时间】:2010-11-24 17:42:36
【问题描述】:

我使用 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. feeDA.Save() 将实体添加到 Repository 并调用 Context.SaveChanges()
  4. 当我尝试拨打这个电话时,我遇到了以下异常: 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()?

附:我尝试将 ExecuteFunction 包装在其自己的事务中,并使用其自己的 TransactionScope 以及所有可能的参数(抑制等),但也有帮助。

【问题讨论】:

  • 您能否进一步澄清数据类是“每个使用单独的 DataContext”还是“共享单个 DataContext”。您的“每个 DataContext 的一个实例”不够具体......

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


【解决方案1】:

查看this other stackoverflow question 中的类似问题,尤其是答案#4:

“我终于找到了解决方案...看来 EF 需要存储过程 (导入函数)返回一个值。所以调用 .FirstOrDefault() 返回时的函数。”

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多