2010-11-24 12 views
5

Uso de Entity Framework 4 y cumplir con el siguiente problema con la ejecución del procedimiento almacenado en la transacción ambiental. Aquí está el código:Llamar procedimiento almacenado dentro de TransactionScope en Entity Framework

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 y FeeDA son datos clases de acceso que utiliza una instancia de DataContext para cada uno. Método
  2. _storedProcedureDA.UpdateOrderRequest() es sólo envoltura de bajo Context.ExecuteFunction<..>("AddOrderRequest",...)
  3. feeDA.Save() agrega entidad en el repositorio y llama Context.SaveChanges()
  4. Cuando i tratar de hacer esta llamada, i la captura siguiente excepción: The transaction operation cannot be performed because there are pending requests working on this transaction.

El punto es que necesito hacer ambas operaciones en una transacción y no puedo usar la solución sugerida en Can't I call a stored procedure from Entity Framework inside a transaction scope? (ado.net usando su propia conexión) ¿Alguien sabe cómo ajustar DataContext.ExecuteFunction <>() en la transacción?

P.S. Intenté ajustar ExecuteFunction en su propia transacción con su propio TransactionScope con todos los parámetros posibles (Supress, etc.), pero ayudó el hothing.

+0

Podría aclarar si las clases de datos "cada una usa un DataContext por separado" o "compartir un solo DataContext". Su "única instancia de DataContext para cada uno" no es lo suficientemente específica ... –

Respuesta

3

Tenga una mirada en el problema similar en this other stackoverflow question, sobre todo en respuesta # 4:

"Finalmente encontré una solución ... Parece EF prevé que el procedimiento almacenado (función importada) para devolver una valor. Así que llame a .FirstOrDefault() en la función cuando vuelva. "

Si eso es aplicable a su propio problema, a continuación, en el interior de su método de _storedProcedureDA.UpdateOrderRequest, donde se llama a Context.ExecuteFunction, toma el valor de retorno (probablemente int) y volver de nuevo al método de llamada (por lo que cambiar UpdateOrderRequest de vacío a int o cualquiera que sea el tipo de valor de retorno).

Veo que esta pregunta es bastante antigua, ¿quizás hace mucho tiempo que la resolvió y siguió adelante?

Cuestiones relacionadas