miroCyber 2023-10-13 01:56 采纳率: 40%
浏览 16
已结题

.Net使用模版自带的注册和角色数据库

我创建了2个AspNetUsers的继承子表分别是doctor和patient,

img

我注册的时候想同时往user里面存账号密码和子表doctor里面存名字,出现了主键冲突。

img

问了别人说要重写这个自带的创建方法,但是我想保留原来的分配角色,请问怎么做

  • 写回答

14条回答 默认 最新

  • 专家-赤兔[在线] 优质创作者: 编程框架技术领域 2023-10-13 08:17
    关注
    获得0.80元问题酬金

    引自强大而免费的微信小程序:皆我百晓生。如有帮助,还望采纳。


    要同时往AspNetUsers表和doctor子表中存储数据,并且保留原来的角色分配,你需要重写AspNetUsers的注册方法。

    首先,你需要在IdentityModels.cs文件中找到ApplicationUser类,然后创建一个自定义的Register方法,如下所示:

    public class ApplicationUser : IdentityUser
    {
        // ...其他属性和方法
    
        public string DoctorName { get; set; } // 添加一个属性用于存储医生名字
    
        // 重写注册方法,将数据同时保存到AspNetUsers和doctor表中
        public async Task<IdentityResult> RegisterAsync(UserManager<ApplicationUser> userManager, string password, string doctorName)
        {
            var user = new ApplicationUser { UserName = this.UserName, Email = this.Email };
            var result = await userManager.CreateAsync(user, password);
    
            if (result.Succeeded)
            {
                using (var context = new ApplicationDbContext())
                {
                    var userId = userManager.FindByName(this.UserName).Id;
    
                    var doctor = new Doctor { DoctorId = userId, DoctorName = doctorName };
                    context.Doctors.Add(doctor);
                    await context.SaveChangesAsync();
                }
            }
    
            return result;
        }
    }
    

    接下来,你需要在AccountController.cs文件的Register方法中调用自定义的Register方法,并传递医生名字参数,如下所示:

    public class AccountController : Controller
    {
        private UserManager<ApplicationUser> _userManager;
        private RoleManager<IdentityRole> _roleManager;
    
        // ...其他代码
    
        [HttpPost]
        [AllowAnonymous]
        [ValidateAntiForgeryToken]
        public async Task<IActionResult> Register(RegisterViewModel model)
        {
            if (ModelState.IsValid)
            {
                // ...其他代码
    
                var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
                var result = await user.RegisterAsync(_userManager, model.Password, model.DoctorName);
    
                // ...其他代码
            }
    
            // ...其他代码
        }
    }
    

    通过以上步骤,你就可以同时将账号密码保存到AspNetUsers表中,将医生名字保存到doctor子表中,并且保留原来的角色分配。

    评论

报告相同问题?

问题事件

  • 系统已结题 10月21日
  • 创建了问题 10月13日