ASP.NET Core 如何将ApplicationUser的ID赋值给Employee的UserId字段
实现方案
- 调用
_userManager.CreateAsync执行成功后,ApplicationUser实例的Id字段会自动生成主键值,直接获取该值赋值给Employee的UserId属性即可 - 建议优先调整业务顺序:先创建Identity用户,成功后再插入Employee数据,避免出现Employee插入成功但用户创建失败的脏数据,不需要额外做更新操作
- 原有代码中混用
await和.Wait()会有线程死锁风险,建议统一使用await异步等待 - 不要手动给
ApplicationUser.PasswordHash赋值明文,_userManager.CreateAsync的第二个参数传入明文密码会自动完成哈希加密,原有赋值逻辑会导致密码验证失败
注意:如果一定要保留原有先插入Employee的逻辑,可以在用户创建成功后调用更新方法同步UserId即可,下文会给出两种实现
推荐方案(先建用户再插Employee,无脏数据风险)
修改后的Service层代码如下:
public async Task<Employee> Post(EmployeeCreateDto employeeCreateDto) { var mapper = new EntityMapper(); var employee = mapper.FromEmployeeCreateDtoToEmployee(employeeCreateDto); try { ApplicationUser user = new ApplicationUser() { UserName = employee.UserName, Email = employee.Email }; // 第二个参数传明文密码,自动完成哈希加密,无需手动赋值PasswordHash IdentityResult result = await _userManager.CreateAsync(user, employee.ConfirmPassword); if (result.Succeeded) { // 检查角色是否存在,统一用await替代Wait()避免死锁 bool hasEmployeeRole = await _roleManager.RoleExistsAsync(UserRoles.Employee); if (!hasEmployeeRole) { ApplicationRole roleCreate = new ApplicationRole() { Name = UserRoles.Employee }; await _roleManager.CreateAsync(roleCreate); } await _userManager.AddToRoleAsync(user, UserRoles.Employee); // 核心逻辑:将生成的用户Id赋值给Employee的外键字段 employee.UserId = user.Id; // 现在插入Employee数据,一次保存即可完成所有操作 await _unitOfWork.EmployeeRepository.Insert(employee); await _unitOfWork.SaveChangesAsync(); } else { // 拼接Identity错误信息方便排查问题 var errorMsg = string.Join(";", result.Errors.Select(e => e.Description)); throw new Exception($"创建用户失败:{errorMsg}"); } } catch (Exception e) { // 保留原始异常堆栈方便排查 throw new Exception($"操作失败:{e.Message}", e); } return employee; }
兼容原有逻辑方案(先插Employee后更新UserId)
如果你一定要保留原有先插入Employee的逻辑,只需在用户创建成功、角色分配完成后新增更新逻辑即可:
// 在newUserRole等待完成后新增以下代码 employee.UserId = user.Id; // 调用仓储的更新方法 _unitOfWork.EmployeeRepository.Update(employee); await _unitOfWork.SaveChangesAsync();
内容的提问来源于stack exchange,提问作者Olugbenga
相关产品推荐
相关产品推荐

