You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 5.0环境下AspNetUsers表自定义列提交后无法存储问题

问题原因
  • 你从缓存中取出的ApplicationUser对象是脱离当前ApplicationDbContext跟踪的游离实体,DbContext无法感知到你对该对象FirstName属性的修改,因此SaveChangesAsync不会生成对应的更新SQL语句,数据自然不会存入数据库。
  • 调试日志中name输出为空属于正常现象:你在调用SaveChangesAsync之前就查询数据库,此时修改还没提交到数据库,自然查不到对应FirstName的记录。
  • 额外隐患:你当前用固定键"User"存缓存,多用户同时注册时会出现缓存覆盖,导致用户数据串错。不建议用缓存传递该类数据,可在注册完成后将用户ID通过路由参数传递到注册确认页,安全性和稳定性更高。
修复方案

推荐优先用用户ID从当前DbContext查询最新实体再修改,避免缓存数据不一致问题,修正后的OnPostAsync代码如下:

public async Task<IActionResult> OnPostAsync()
{
    Debug.WriteLine("******************* On Post Async");

    using (ApplicationDbContext dbContext = new ApplicationDbContext())
    {
        ApplicationUser cachedUser = (ApplicationUser)_cache.Get("User");
        // 从当前DbContext查询受跟踪的用户实体
        var user = await dbContext.Users.FindAsync(cachedUser.Id);
        if (user == null)
        {
            // 可自行补充用户不存在的异常处理逻辑
            return NotFound();
        }
        
        Debug.WriteLine("******************* user: " + user.ToString());
        Debug.WriteLine("******************* userId: " + user.Id);

        user.FirstName = Input.FirstName;
        Debug.WriteLine("******************* FirstName: " + Input.FirstName);

        await dbContext.SaveChangesAsync();
    }
    Debug.WriteLine("******************* Return Page");

    return RedirectToPage("RegisterConfirmation", new { culture });
}

如果要沿用缓存对象的方式,也可以手动附加实体并标记修改:

public async Task<IActionResult> OnPostAsync()
{
    Debug.WriteLine("******************* On Post Async");

    using (ApplicationDbContext dbContext = new ApplicationDbContext())
    {
        ApplicationUser user = (ApplicationUser)_cache.Get("User");
        Debug.WriteLine("******************* user: " + user.ToString());
        var userId = user.Id.ToString();
        Debug.WriteLine("******************* userId: " + userId);

        // 将游离的缓存实体附加到当前DbContext
        dbContext.Attach(user);
        user.FirstName = Input.FirstName;
        // 标记FirstName属性已修改
        dbContext.Entry(user).Property(u => u.FirstName).IsModified = true;
        Debug.WriteLine("******************* FirstName: " + Input.FirstName);

        await dbContext.SaveChangesAsync();
    }
    Debug.WriteLine("******************* Return Page");

    return RedirectToPage("RegisterConfirmation", new { culture });
}

内容的提问来源于stack exchange,提问作者DMur

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 10:18:03