2010-11-24 69 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或任何返回值類型)。

我看到這個問題很老了,所以也許你很久以前就解決了它,並繼續前進?