Вызов хранимой процедуры внутри TransactionScope в Entity Framework - PullRequest
5 голосов
/ 24 ноября 2010

Я использую 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() добавляет сущность в репозиторий и вызывает Context.SaveChanges()
  4. Когда я пытаюсь сделать этот вызов, я ловлю следующее исключение: The transaction operation cannot be performed because there are pending requests working on this transaction.

Дело в том, что мне нужно выполнить обе эти операции в одной транзакции, и я не могу использовать обходной путь, предложенный в Не могу ли я вызвать хранимую процедуру из Entity Framework внутри области транзакции? ( ado.net использует собственное соединение) Кто-нибудь знает, как обернуть DataContext.ExecuteFunction <> () в транзакции?

P.S. Я пытался обернуть ExecuteFunction в свою собственную транзакцию с собственным TransactionScope со всеми возможными параметрами (Supress и т. Д.), Но ничего не помогло.

1 Ответ

3 голосов
/ 26 июня 2013

Посмотрите на похожую проблему в этом другом вопросе о стекопереработке , в частности, на ответ № 4:

"Я наконец нашел решение ... кажется, EF ожидаетсохраненная процедура (импортированная функция) для возврата значения. поэтому вызовите .FirstOrDefault () для функции, когда она вернется. "

Если это применимо к вашей проблеме, то внутри вашего _storedProcedureDA.UpdateOrderRequestметод, в котором вы вызываете Context.ExecuteFunction, захватывает возвращаемое значение (возможно, int) и возвращает его обратно вызывающему методу (поэтому измените UpdateOrderRequest с void на int или любым другим типом возвращаемого значения).

Я вижуэтот вопрос довольно старый, поэтому, может быть, вы давно решили его и пошли дальше?

...