弘帝企业智能建站系统交流平台

 找回密码
 立即注册
查看: 351|回复: 1

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

[复制链接]
发表于 2023-12-12 21:37:15 | 显示全部楼层 |阅读模式
假定在HD_Users中添加新字段FullName。
注意如何将原AspNetUsers改成HD_Users,请查看【C#】修改 .NET Identity 中的表名和字段名
http://wh.ac.cn/forum.php?mod=vi ... =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
更新到数据库实例中,让数据库的表字段得到更正。
回复

使用道具 举报

 楼主| 发表于 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中通过。


回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|弘帝企业智能建站系统 ( 皖ICP备07503252号 )

GMT+8, 2024-4-28 19:56 , Processed in 0.058500 second(s), 15 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表