C# .NET核心标识使用userManager并加载其他ApplicationUser属性

C# .NET核心标识使用userManager并加载其他ApplicationUser属性,c#,.net-core,asp.net-identity,C#,.net Core,Asp.net Identity,我的问题是基于主题的,但由于我不允许在那里添加评论,我想我必须打开一个新的线程 在我的ASP.NET核心后端中,我使用ASP.NET核心标识进行用户管理。它通过所谓的用户管理器提供用户身份验证方法 我现在一方面在使用用户管理器的方法,另一方面在加载自定义应用程序用户属性方面遇到了麻烦 场景如下:前端通过MVC控制器(HTTP请求)发送包含电子邮件地址和密码的登录dto。现在,我想使用用户管理器提供的方法findbyemailsync加载应用程序用户。我将此方法包装在一个自制的应用程序用户存储库中

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

在我的ASP.NET核心后端中,我使用ASP.NET核心标识进行用户管理。它通过所谓的用户管理器提供用户身份验证方法

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

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

我首先尝试完全通过上下文(而不是通过用户管理器)加载用户。这很好,附加属性也可以加载。之后尝试使用
usermanager.CheckPasswordAsync
方法时,问题开始出现。我有一个例外:

“无法跟踪实体ApplicationUser的实例 因为id具有相同键值的另一个实例已存在 “被跟踪”

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

  • 建议:

    var user = await userManager.Users
      .Include(x => x.Address)
      .SingleAsync(x => x.NormalizedEmail == email);
    
    await context.Entry(user).Reference(x => x.Address).LoadAsync();
    
  • userManager.Users
    是一个
    IQueryable
    ,不包含Include方法

  • 建议:

    var user = await userManager.Users
      .Include(x => x.Address)
      .SingleAsync(x => x.NormalizedEmail == email);
    
    await context.Entry(user).Reference(x => x.Address).LoadAsync();
    
  • 在我的示例中,自定义属性(证书)是一个集合,因此我使用了
    .collection
    而不是
    .Reference
    ,但出现以下错误:

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

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


    谢谢大家!

    我也遇到了同样的问题,并注意到当您在访问自定义属性之前加载DbContext时,它会起作用

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