2010-11-24 119 views
5

我使用实体框架4并满足以下问题,在环境事务中执行存储过程。 下面是代码:调用实体框架中的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(); 
    } 
} 
  1. _StoredProceduresDA和FEEDA是使用的DataContext的一个实例为每个数据访问类。
  2. _storedProcedureDA.UpdateOrderRequest()方法是刚下Context.ExecuteFunction<..>("AddOrderRequest",...)
  3. feeDA.Save()包装器增加了实体到存储库,并呼吁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 <>()?

P.S.我试图用它自己的TransactionScope包装ExecuteFunction和所有可能的参数(Supress等),但是有帮助。

+0

请问您是否可以进一步阐明数据类“每个使用单独的DataContext”还是“共享一个DataContext”。你的“每个DataContext的实例”都不够具体...... – 2013-05-16 11:51:51

回答

3

看一看类似的问题this other stackoverflow question,特别是在回答#4:

“我终于找到了解决办法...看来EF预计存储过程 (进口功能)返回一个值,所以在函数返回时调用.FirstOrDefault() 。“

如果这适用于你自己的问题,那么你的_storedProcedureDA.UpdateOrderRequest方法,在那里你叫Context.ExecuteFunction内,抢返回值(可能是INT),然后返回给调用方法(因此改变UpdateOrderRequest从void到int或任何返回值类型)。

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