我的问题基于这里的主题,但由于我不允许在那里添加评论,我想我必须打开一个新线程。
在我的 ASP.NET 核心后端中,我正在使用 ASP.NET 核心身份进行用户管理。它提供了在所谓的用户管理器的帮助下进行用户身份验证的方法。
我现在一方面在使用用户管理器中的方法时遇到麻烦,另一方面又在使用自定义应用程序用户属性时遇到麻烦。
场景如下:前端通过 MVC 控制器(HTTP 请求(发送包含电子邮件地址和密码的登录 DTO。我现在想使用用户管理器提供的方法加载应用程序用户FindByEmailAsync
。我将此方法包装在自制的应用程序用户存储库中,其中用户管理器通过依赖注入注入,并且还可以访问应用程序上下文。由于用户管理器在加载用户管理器时不加载自定义属性,因此我还必须执行一些其他操作来加载这些属性。
我首先尝试完全通过上下文(而不是通过用户管理器(加载用户。这工作正常,也可以加载其他属性。问题在之后尝试使用usermanager.CheckPasswordAsync
方法时开始。我有一个例外:
"无法跟踪实体应用程序用户的实例 因为另一个具有相同 id 键值的实例已经 被跟踪"。
我认为这是由于一方面使用上下文加载用户,另一方面使用用户管理器来执行checkPassword
。然后我尝试用usermanager
的FindByEmailAsync
加载用户。一切正常,没有例外,但尚未加载自定义属性。在我上面链接的线程中,有一些建议,但没有一个对我有用。
-
建议:
var user = await userManager.Users .Include(x => x.Address) .SingleAsync(x => x.NormalizedEmail == email);
userManager.Users
是一个IQueryable<Users>
,不包含 Include 方法。
-
建议:
await context.Entry(user).Reference(x => x.Address).LoadAsync();
就我而言,自定义属性(证书(是一个集合,所以我使用.Collection
而不是.Reference
,但出现以下错误:
"类型实体上的导航属性'证书' 无法加载"应用程序用户",因为实体不是 跟踪。只能加载用于跟踪的导航属性 实体。
有没有人建议如何使用用户管理器提供的方法并包括应用程序用户的自定义属性?
谢谢!
我遇到了同样的问题,并注意到它在访问自定义属性之前加载 DbContext 时有效
var user = await userManager.Users;
_context.Users.Include(u => u.Address).FirstOrDefault(x => x.NormalizedEmail == email);
var adress = user.Address;