c# - 当用户表获得新记录时,使用 .NET Core 标识中的用户 ID 在另一个表中创建记录
问题描述
我必须编写代码,当用户表获得新记录时,然后使用 .net 核心在表中自动创建记录siteUSer
。userID
siteCodeId
user
表没有siteCodeId
作为列。我需要将userId
对应的记录添加siteCodeID
到siteUSer
表中。
public class SiteUsers
{
public int SiteCodeId { get; set; }
public SiteCode SiteCode { get; set; }
public string UserId { get; set; }
public User User { get; set; }
}
这是usersController.cs
:
[HttpPost]
public async Task<IActionResult> Create(UserBO userBO)
{
try
{
await _userService.CreateUserAsync(userBO);
return Created(nameof(Get), userBO);
}
catch (Exception ex)
{
return HandleException(ex);
}
}
这是usersService.cs
:
public async Task<UserBO> CreateUserAsync(UserBO userBO)
{
var user = new User
{
UserName = userBO.UserName,
Email = userBO.Email,
EmailConfirmed = true,
RecordState = Enums.RecordState.Active,
};
var result = await _userManager.CreateAsync(user, userBO.Password);
if (userBO.Roles.Count > 0)
{
// superadmin users can be created manually
userBO.Roles = userBO.Roles.Where(i => i != "SuperAdmin").ToList();
}
foreach (var item in userBO.Roles)
{
await _userManager.AddToRoleAsync(user, item);
}
return userBO;
}
解决方案
您正在执行三个操作:
- 创建一个新用户
- 将用户添加到某些角色
SiteUsers
为用户创建一个
- 在
UserService.cs
. - 注入
DbContext
(假设您使用的是 EF Core;如果没有,则注入等效服务以添加SiteUsers
到数据库中)。使用此服务向SiteUsers
数据库添加新的。 - 此外,您可以使用来自 的电子邮件
UserBO
来查找已创建的用户。 - 您甚至不需要使用 for 循环将用户添加到多个角色,您可以使用
AddToRolesAsync()
它来接受IEnumerable<string>
:
public async Task<IdentityResult> CreateUserAsync(UserBO userBO)
{
var user = new User
{
UserName = userBO.UserName,
Email = userBO.Email,
EmailConfirmed = true,
RecordState = Enums.RecordState.Active,
};
return await _userManager.CreateAsync(user, userBO.Password);
}
public async Task CreateSiteUsersAsync(UserBO userBO, User user)
{
SiteUsers siteUsers = new SiteUsers { UserId = user.Id, User = user };
await _context.AddAsync(siteUsers);
await _context.SaveChangesAsync();
}
public async Task<IdentityResult> AddToRolesAsync(UserBO userBO, User user)
{
if (userBO.Roles.Count > 0)
{
userBO.Roles = userBO.Roles.Where(i => i != "SuperAdmin").ToList();
}
return await _userManager.AddToRolesAsync(user, userBO.Roles);
}
public async Task<User> FindByEmailAsync(string email) => _userManager.FindByEmailAsync(email);
现在,在您的控制器操作中,调用每个方法:
public async Task<IActionResult> Create(UserBO userBO)
{
try
{
//Create user
IdentityResult createUserResult = await _userService.CreateUserAsync(userBO);
if(!createUserResult.Succeeded)
{
//Handle error
}
//Find created user
User user = await _userService.FindByEmailAsync(userBO.Email);
if(user is null)
{
//Handle error
}
//Add to roles
IdentityResult addToRolesResult = await _userService.AddToRolesAsync(userBO, user);
if(!addToResult.Succeeded)
{
//Handle error
}
await CreateSiteUsersAsync(userBO, user)
return Created(nameof(Get), userBO);
}
catch (Exception ex)
{
return HandleException(ex);
}
}
推荐阅读
- c++ - 为什么标准库不以无锁方式为 8 字节以下的结构实现 std::atomic?
- python - 如何播放一次声音,但不只播放一次?
- php - 如何在 php 主机中更改 ip-user 代理或代理?
- c - 如何计算 Linux 中进程的开始时间?
- swift - 你真的可以在 Swift/Xcode 中“倒带/倒转”调试器吗?
- sql-server - 使用存储过程中的更新语句发出测试错误处理
- json - 将带有注释的 django 查询集发送到我的 rest api
- android - Firebase RecyclerView 图片未显示,其余信息为
- excel - Mac:Excel VBA - 使用 XPath 向网站发出 HTTP 请求并获得价值
- c# - 从 httpclient 的响应字符串中的键中获取值