首页 > 解决方案 > .NET Core Identity 使用 userManager 并加载其他 ApplicationUser 属性

问题描述

我的问题是基于这里的主题,但由于我不允许在那里添加评论,我想我必须打开一个新线程。

在我的 ASP.NET Core 后端中,我使用 ASP.NET Core Identity 进行用户管理。它在所谓的用户管理器的帮助下提供了用户认证方法。

我现在一方面在使用用户管理器中的方法,另一方面在加载自定义应用程序用户属性方面遇到了麻烦。

场景如下:前端通过 MVC 控制器(HTTP 请求)发送包含电子邮件地址和密码的登录 dto。我现在想用FindByEmailAsync用户管理器提供的方法加载应用程序用户。我将此方法包装在一个自制的应用程序用户存储库中,其中用户管理器通过依赖注入注入,并且还可以访问应用程序上下文。由于用户管理器在加载用户管理器时不会加载自定义属性,因此我也必须做一些额外的事情来加载这些属性。

我首先尝试通过上下文完全加载用户(而不是通过用户管理器)。效果很好,也可以加载其他属性。后来尝试使用该usermanager.CheckPasswordAsync方法时,问题就开始了。我有一个例外:

“无法跟踪实体 ApplicationUser 的实例,因为已经跟踪了具有相同 id 键值的另一个实例”。

我认为这是由于一方面使用上下文加载用户而用户管理器执行checkPassword. 然后我尝试FindByEmailAsyncusermanager. 一切正常,没有例外,但尚未加载自定义属性。在我上面链接的线程中有一些建议,但没有一个对我有用。

  1. 建议:

    var user = await userManager.Users
      .Include(x => x.Address)
      .SingleAsync(x => x.NormalizedEmail == email);
    

userManager.Users是一个IQueryable<Users>并且不包含 Include 方法。

  1. 建议:

    await context.Entry(user).Reference(x => x.Address).LoadAsync();
    

在我的情况下,自定义属性(证书)是一个集合,所以我使用.Collection而不是.Reference,但出现以下错误:

“无法加载‘ApplicationUser’类型实体上的导航属性‘证书’,因为该实体未被跟踪。导航属性只能为被跟踪的实体加载。”

是否有人建议如何使用用户管理器提供的方法并将自定义属性包括给应用程序用户?

谢谢!

标签: c#.net-coreasp.net-identity

解决方案


我遇到了同样的问题,并注意到在访问自定义属性之前加载 DbContext 时它可以工作

var user = await userManager.Users;
_context.Users.Include(u => u.Address).FirstOrDefault(x => x.NormalizedEmail == email);

var adress = user.Address;

推荐阅读