Использование идентификатора asp.net версия RTW< /а>.
Мне нужно выполнить несколько действий в транзакции, включая вызовы функций UserMananger
и другие операции с моим DbContext
(например: создать нового пользователя, добавить его в группу и выполнить некоторые операции бизнес-логики).
Как мне это сделать?
Мои мысли следуют.
Область транзакции
using (var scope = new TransactionScope(TransactionScopeOption.Required))
{
// Do what I need
if (everythingIsOk) scope.Complete();
}
Проблема в том, что все функции UserManager
асинхронны, а TransactionScope
не предназначена для работы с async/await. Похоже, это решено в .Net Framework 4.5.1. Но я использую веб-сайты Azure для размещения своих сборок проектов, поэтому пока не могу ориентироваться на 4.5.1.
Транзакция базы данных
public class SomeController : Controller
{
private MyDbContext DbContext { get; set; }
private UserManager<User> UserManager { get; set; }
public AccountController()
{
DbContext = new MyDbContext()
var userStore = new UserStore<IdentityUser>(DbContext);
UserManager = new UserManager<IdentityUser>(userStore);
}
public async ActionResult SomeAction()
{
// UserManager uses the same db context, so they can share db transaction
using (var tran = DbContext.Database.BeginTransaction())
{
try
{
// Do what I need
if (everythingIsOk)
tran.Commit();
else
{
tran.Rollback();
}
}
catch (Exception)
{
tran.Rollback();
}
}
}
}
Кажется, это работает, но как я могу его протестировать?
Конструктор UserManager<>
принимает IUserStore<>
, поэтому я могу легко его заглушить.
Конструктор UserStore<>
принимает DbContext
, понятия не имею, как я могу это заглушить.