Мое приложение 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