Использование TransactionScope с кодом Entity Framework в первую очередь и универсальными поставщиками

Я пытаюсь настроить транзакцию, в которой мой код создает нового пользователя с помощью поставщика членства, а затем создает объект и помещает его в одну из моих таблиц Entity Framework. В случае сбоя операции EF я хочу иметь возможность отката до того, как пользователь был создан. У меня есть одна строка подключения как для EF, так и для членства, поэтому я думаю, что обе операции должны использовать одно и то же соединение sql.

Когда я впервые запускаю его, я получаю

«MSDTC на сервере… недоступен».

исключение в строке Membership.CreateUser. Когда я запускаю службу DTC, я получаю

"Базовый провайдер не работает при открытии"

исключение с внутренним исключением

«Операция недействительна для состояния транзакции».

на той же линии. Если я изменю порядок и сначала сделаю сохранение EF, а затем членство, часть EF будет работать, но CreateUser завершится ошибкой с теми же исключениями.

Кажется, что используются 2 соединения sql, хотя у меня есть одна строка соединения. Есть ли способ заставить операции членства и EF использовать одно и то же соединение или есть какой-то другой способ поместить это в транзакцию?

Вот код

using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required))
{
    MembershipCreateStatus createStatus;
    MembershipUser user = Membership.CreateUser(model.UserName, model.Password, model.UserName, null, null, true, null, out createStatus);

    //add objects to the DbContext db

    db.SaveChanges();
    scope.Complete();

person user1270224    schedule 15.03.2012    source источник


Ответы (1)


Как вы говорите, даже если вы используете одну и ту же строку подключения как для EF, так и для членства, они используют разные соединения, а затем область транзакции автоматически переходит в DTC.

И насколько я знаю, для использования одного и того же соединения для обоих

невозможно поместить пользовательское соединение в SqlMembershipProvider

согласно этой ссылке

во избежание вовлечения DTC

person raoof hojat    schedule 09.04.2012