使用ASP进行事务处理.. NET Core 1.0身份用户管理器



在我的一个应用程序中,我重写Asp Core Identity UserManager的CreateAsync,除了在UserStore中创建新用户之外-在单独的统计表中创建新行(在不同的dbcontext上)。问题是,我希望这两个操作都在事务中触发,这样如果一个失败,另一个就不会提交。下面是代码:

public override async Task<IdentityResult> CreateAsync(TUser user, string password)
    {
        // We need to use transactions here.            
            var result = await base.CreateAsync(user, password);
            if (result.Succeeded)
            {
                var appUser = user as IdentityUser;
                if (appUser != null)
                {
                    // create user stats.
                    var userStats = new UserStats()
                    {
                        ActionsCount = 0,
                        EventsCount = 0,
                        FollowersCount = 0,
                        ProjectsCount = 0,
                        UserId = appUser.Id
                    };
                    _ctx.UserStats.Add(userStats);
                    await _ctx.SaveChangesAsync();
                }
            }    
            return result;
    }

的事情是,我不知道如何设置这样一个事务,因为它看起来TransactionScope还没有。net核心的一部分(?),目前范围DbContext base.CreateAsync与HttpContext.GetOwinContext()()不工作HttpContext似乎缺少这种方法(引用Microsoft.Owin.Host.SystemWeb或Microsoft.AspNet.WebApi.Owin暗示在其他堆栈溢出的答案不会做——不兼容.netcore)。有什么帮助吗?

首先,您需要设置您正在使用的具有范围生存期的身份的dbcontext:

        services.AddDbContext<MyDbContext>(ServiceLifetime.Scoped); // this is the important bit
        services.AddIdentity<User, Role>(options =>
        {
        })
        .AddEntityFrameworkStores<MyDbContext, int>()
        .AddDefaultTokenProviders();

当你需要创建一个事务时,你需要做以下操作:

        using (var transaction = await _myDbContext.Database.BeginTransactionAsync())
        {
            var result = await _userManager.CreateAsync(newUser, password);
            try
            {
                if (result.Succeeded)
                {
                    DBItem newItem = new DBItem();
                    _myDbContext.Add(newItem);
                    await _myDbContext.SaveChangesAsync();
                    transaction.Commit();
                }
            }
            catch (Exception e)
            {
                transaction.Rollback();
            }
        }

相关内容

  • 没有找到相关文章

最新更新