我正试图更新一个用户。
AppUserManager appUserManager = HttpContext.GetOwinContext().GetUserManager<AppUserManager>();
AppUser member = await appUserManager.FindByIdAsync(User.Identity.GetUserId());
member.HasScheduledChanges = true;
IdentityResult identityResult = appUserManager.Update(member);
如果Web API的后续调用失败,我需要回滚对用户进行的任何更改。 我知道事务可以做到这一点,就像这样:
using (var context = HttpContext.GetOwinContext().Get<EFDbContext>())
{
using (var dbContextTransaction = context.Database.BeginTransaction())
{
try
{
// Changes
member.HasScheduledChanges = true;
// Would this be transactional?
IdentityResult identityResult = appUserManager.Update(member);
context.SaveChanges();
dbContextTransaction.Commit();
}
catch //(Exception ex)
{
// dbContextTransaction.Rollback(); no need to call this manually.
}
}
}
但是在try块中使用AppUserManager执行的操作是否具有事务性?另外,它们是否使用相同的EFDbContext实例?换句话说,我不知道第二个代码示例开头的var context是否会被try块中的appUserManager“Update”方法调用使用。
此外,AppUserManager是这样创建的:
public static AppUserManager Create(IdentityFactoryOptions<AppUserManager> options, IOwinContext context)
{
EFDbContext db = context.Get<EFDbContext>();
AppUserManager manager = new AppUserManager(new UserStore<AppUser>(db));
// etc.
return manager;
}
dbContext
操纵用户记录。这就是AppUserManager
所做的,只不过它添加了一些额外的验证。 - trailmaxscope.dispose()
。捕获并重新抛出异常除了减缓失败速度外没有任何作用,因为它实际上必须捕获异常。 - Marie