首页 > 解决方案 > 当用户表获得新记录时,使用 .NET Core 标识中的用户 ID 在另一个表中创建记录

问题描述

我必须编写代码,当用户表获得新记录时,然后使用 .net 核心在表中自动创建记录siteUSeruserIDsiteCodeId

user表没有siteCodeId作为列。我需要将userId对应的记录添加siteCodeIDsiteUSer表中。

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;
}

标签: c#.net-coreasp.net-identity

解决方案


您正在执行三个操作:

  1. 创建一个新用户
  2. 将用户添加到某些角色
  3. 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);
    }
}

推荐阅读