我创建了2个AspNetUsers的继承子表分别是doctor和patient,
我注册的时候想同时往user里面存账号密码和子表doctor里面存名字,出现了主键冲突。
我创建了2个AspNetUsers的继承子表分别是doctor和patient,
我注册的时候想同时往user里面存账号密码和子表doctor里面存名字,出现了主键冲突。
引自强大而免费的微信小程序:皆我百晓生。如有帮助,还望采纳。
要同时往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子表中,并且保留原来的角色分配。