Объем транзакции с двумя методами подключения - PullRequest
1 голос
/ 19 ноября 2011

Мое приложение ASP.NET MVC использует Application Services for Membership. По ряду причин я не использую профили служб приложений. Я управляю профилями в кучу индивидуальных таблиц, которые связаны с таблицами членства. Моя модель домена состоит из классов, которые с помощью Entity Framework (DbContext) отображаются на мои таблицы (включая таблицы профилей, но не таблицы служб приложений).

Когда новый пользователь создается провайдером членства, я хочу сделать несколько вещей в таблицах своего профиля и откатить создание членства, если какой-либо из этапов подготовки моего профиля завершится неудачей.

Поэтому я изменил метод регистрации, включив в него вызов методов, выполняющих нужную мне работу, и поместил все это в TransactionScope. Код работает нормально, когда нет Transaction, но с использованием TransactionScope, как только метод context.SaveChanges () вызывается из класса репозитория (который находится в отдельной сборке), я получаю ошибку: «Поставщик сделал не возвращает строку ProviderManifestToken. "

using (TransactionScope scope = new TransactionScope())
{
System.Web.Security.MembershipUser newUser = Membership.CreateUser
    (model.UserName, model.Password, model.Email, null, null, true, null, out createStatus);

if (createStatus == MembershipCreateStatus.Success)
{
    FormsAuthentication.SetAuthCookie(model.UserName, false /* createPersistentCookie */);

    // Create the profile and permissions
    bool profileCreation = repository.NewUser(newUser.UserName, newUser.ProviderUserKey);

    if (profileCreation)
    {
        scope.Complete();
        return RedirectToAction("List", "Project");
    }
    else scope.Dispose();
}
else
{
    scope.Dispose();
    ModelState.AddModelError("", ErrorCodeToString(createStatus));
}                    
}

Возможно ли для транзакций обрабатывать соединения с базой данных, которые поступают из Entity Framework и кода Application Services (я не знаю, какой метод соединения он использует)? Если да, то как мне этого добиться?

Буду очень признателен за любую помощь, Dave

Ответы [ 2 ]

2 голосов
/ 19 ноября 2011

Похоже, что EF или ваш поставщик услуг не зачислен в транзакцию (EnlistTransaction). Являются ли SQL-соединения для каждого участника с одним и тем же сервером (очевидно, разными хранилищами данных)? Вы можете попробовать выполнить область транзакции, используя только поставщика членства или только Entity Framework, чтобы увидеть, какой из них вызывает горе.

См. Этот пост относительно использования области транзакции .

Вам также не нужно звонить на scope.Dispose(), так как вы находитесь в using заявлении. Это неявно сделано для вас.

0 голосов
/ 09 июня 2012

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

...