admin 发表于 2023-12-12 21:37:15

【C#】在 .NET Identity 中的用户表中添加新字段

假定在HD_Users中添加新字段FullName。
注意如何将原AspNetUsers改成HD_Users,请查看【C#】修改 .NET Identity 中的表名和字段名
http://wh.ac.cn/forum.php?mod=viewthread&tid=3156&fromuid=1

这儿代码也重复了实现过程,在此基础上添加新字段。
public class HondyChatContext : IdentityDbContext<HondyChatUser>
{
    public HondyChatContext(DbContextOptions<HondyChatContext> options)
      : base(options)
    {
    }

    protected override void OnModelCreating(ModelBuilder builder)
    {
      base.OnModelCreating(builder);


      //修改原表前缀AspNet为HD_
      builder.Entity<IdentityRoleClaim<string>>().ToTable("HD_RoleClaims");
      builder.Entity<IdentityRole>().ToTable("HD_Roles");
      builder.Entity<IdentityUserClaim<string>>().ToTable("HD_UserClaims");
      builder.Entity<IdentityUserLogin<string>>().ToTable("HD_UserLogins");
      builder.Entity<IdentityUserRole<string>>().ToTable("HD_UserRoles");
      builder.Entity<IdentityUserToken<string>>().ToTable("HD_UserTokens");
      builder.Entity<HondyChatUser>().ToTable("HD_Users");

      //添加默认不存在新的自定义字段,这儿是重点哟!
      builder.Entity<HondyChatUser>().Property(u => u.FullName).HasMaxLength(100);
      //其它字段
    }
}
//这儿定义FullName
public class HondyChatUser : IdentityUser
{
    public string? FullName { get; set; }
    //其它字段
}

以上是对数据库结绝迁移的操作,请勿操作人工操作数据库的前提下,保证迁移结构完整的代码。

下面是生成数据库的数据
1、dotnet ef migrations add HondyChat
上面会生成一个20231212132220_HondyChat.cs,注意如果文件表已经存在,可能生成错误,删除原来的即可,也可以修改成任何其它名,比如InitialCreate

2、dotnet ef database update
更新到数据库实例中,让数据库的表字段得到更正。

admin 发表于 2023-12-12 21:57:25

代码实现数据库与表单的相互响应

在.cshtml文件的表单中,添加:
<div class="form-floating mb-3">
    <input asp-for="Input.FullName" class="form-control" placeholder="Please enter your full name." />
    <label asp-for="Input.FullName" class="form-label"></label>
    <span asp-validation-for="Input.FullName" class="text-danger"></span>
</div>


在.cshtml.cs代码段中,找到LoadAsync
private async Task LoadAsync(HondyChatUser user)
{
    var userName = await _userManager.GetUserNameAsync(user);
    var phoneNumber = await _userManager.GetPhoneNumberAsync(user);
    var fullName = user.FullName; // 从用户实体中获取 FullName 值

    Username = userName;

    Input = new InputModel
    {
      PhoneNumber = phoneNumber,
      FullName=fullName
    };
}


找到OnPostAsync()
public async Task<IActionResult> OnPostAsync()
{
    var user = await _userManager.GetUserAsync(User);
    if (user == null)
    {
      return NotFound($"Unable to load user with ID '{_userManager.GetUserId(User)}'.");
    }

    if (!ModelState.IsValid)
    {
      await LoadAsync(user);
      return Page();
    }

    var phoneNumber = await _userManager.GetPhoneNumberAsync(user);
    if (Input.PhoneNumber != phoneNumber)
    {
      var setPhoneResult = await _userManager.SetPhoneNumberAsync(user, Input.PhoneNumber);
      if (!setPhoneResult.Succeeded)
      {
            StatusMessage = "Unexpected error when trying to set phone number.";
            return RedirectToPage();
      }
    }
    // 添加处理 FullName 的逻辑
    if (Input.FullName != user.FullName)
    {
      user.FullName = Input.FullName;
      var setResult = await _userManager.UpdateAsync(user);
      if (!setResult.Succeeded)
      {
            StatusMessage = "Unexpected error when trying to set full name.";
            return RedirectToPage();
      }
    }
    await _signInManager.RefreshSignInAsync(user);
    StatusMessage = "Your profile has been updated";
    return RedirectToPage();
}

以上红色部分即是对FullName与数据库响应的代码,在实例HondyChat-->Areas-->Identity-->Account-->Manage-->Index.cshml中通过。


页: [1]
查看完整版本: 【C#】在 .NET Identity 中的用户表中添加新字段