Использование TransactionScope с кодом Entity Framework и универсальных поставщиков - PullRequest
2 голосов
/ 15 марта 2012

Я пытаюсь настроить транзакцию, в которой мой код создает нового пользователя с использованием поставщика членства, а затем продолжает создавать объект и помещать его в одну из моих таблиц 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();

1 Ответ

0 голосов
/ 09 апреля 2012

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

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

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

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

чтобы избежать DTC

...