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