.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
相关产品推荐
相关产品推荐

