Несколько вызовов хранимых процедур в одной транзакции с Entity Framework 5

Я использую Entity Framework 5, и мне нужно выполнить несколько вызовов хранимых процедур в одной транзакции. Все они являются вставками, каждая из которых зависит от вывода предыдущего, и я хочу иметь возможность откатить все назад в случае сбоя одного из них. Каждый вызов использует один и тот же объект Entities. Первый вызов выполняется успешно, но следующий всегда завершается ошибкой со следующей ошибкой:

«Базовый провайдер не удалось открыть».

Внутреннее исключение: «Доступ к сети для диспетчера распределенных транзакций (MSDTC) отключен. Включите DTC для доступа к сети в конфигурации безопасности для MSDTC с помощью инструмента администрирования служб компонентов».

Внутреннее внутреннее исключение: «Диспетчер транзакций отключил поддержку удаленных / сетевых транзакций. (Исключение из HRESULT: 0x8004D024)»

Есть ли способ сделать это, не идя по дороге DTC?

Код:

ObjectParameter outputParam1 = new ObjectParameter("newEntity1", 0);
ObjectParameter outputParam2 = new ObjectParameter("newEntity2", 0);

using (var scope = new TransactionScope())
{
    try
    {
        using(var context = new DatabaseContext())
        {
            context.f_createEntity1(outputParam1);
        }

        using(var context = new DatabaseContext())
        {
            context.f_createEntity2(ouputParam2, outputParam1.Value);
        }

        ... other calls ...

        scope.Complete();
    }
    catch (Exception ex)
    {
        ... handle error ...
    }
}

person Ross    schedule 28.08.2012    source источник


Ответы (1)


Невозможно сделать это, не включив DTC.

Из связанного сообщения SO:

В транзакции задействованы как минимум два надежных ресурса, поддерживающих однофазные уведомления. Например, включение одного соединения с не приводит к продвижению транзакции. Однако всякий раз, когда вы открываете второе соединение с базой данных, вызывающее включение базы данных, инфраструктура System.Transactions обнаруживает, что это второй надежный ресурс в транзакции, и переводит его в транзакцию MSDTC.

person Mark Oreta    schedule 28.08.2012