【问题标题】:Identity UserManager UpdateAsync doesn't save custom fields to databaseIdentity UserManager UpdateAsync 不会将自定义字段保存到数据库
【发布时间】:2017-12-30 23:24:00
【问题描述】:

我有一个使用 AspNet Identity 设置的 .NET Core 2 MVC 项目,使用 ApplicationUser:

public class ApplicationUser : IdentityUser
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

在此操作中,我从表单中获取 FirstName 和 LastName,并希望将其保存到数据库中:

private readonly UserManager<ApplicationUser> _userManager;

...

var user = _userManager.GetUserAsync(User).Result;
user.FirstName = model.FirstName;
user.LastName = model.LastName;

var result = _userManager.UpdateAsync(user).Result;

除了使用_userManager.UpdateAsync(user) 保存自定义字段外,一切正常(更新密码、重置密码等)。返回的结果。Succeeded 始终为 true,但更改不会保存到数据库中。

我在这里做错了什么?

编辑: 调试控制台为 UpdateAsync 输出以下更新查询,它缺少自定义字段:

UPDATE [AspNetUsers] SET [AccessFailedCount] = @p0, [ConcurrencyStamp] = @p1, [Email] = @p2, [EmailConfirmed] = @p3, [FirstName] = @p4, [LastName] = @p5, [LockoutEnabled] = @p6, [LockoutEnd] = @p7, [NormalizedEmail] = @p8, [NormalizedUserName] = @p9, [PasswordHash] = @p10, [PhoneNumber] = @p11, [PhoneNumberConfirmed] = @p12, [SecurityStamp] = @p13, [TwoFactorEnabled] = @p14, [UserName] = @p15

【问题讨论】:

  • 添加自定义属性后是否生成了迁移
  • 是的,我做到了。仔细检查并且列存在于数据库中
  • 您可以尝试将 await 放在 GetUserAsync 上
  • await 似乎确实解决了这个问题。你知道为什么这会解决它吗?我认为删除等待只是以完全相同的方式执行该功能,但非异步......
  • 当您从模型中设置 FirstName 和 LastName 时,它​​仍在运行 asnyc 函数。删除 await 使其异步运行,添加 await 使其同步运行。

标签: asp.net-core asp.net-identity


【解决方案1】:

为了完整起见,我将发表我的评论作为答案。 当您设置 FirstName 和 LastName 时,GetUserAsync 函数仍在运行。在 GetUserAsync 方法中添加 await 会强制代码在继续之前等待 Async 函数完成。

【讨论】:

  • OP 正在调用 .Result,它将等待结果(但将是阻塞调用,甚至可能导致死锁,这不是一个好的做法,但这里不太可能出现问题)
猜你喜欢
  • 1970-01-01
  • 2019-07-21
  • 1970-01-01
  • 1970-01-01
  • 2012-11-08
  • 2015-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多