![](/img/trans.png)
[英]ASP.NET Core Identity does not inject UserManager<ApplicationUser>
[英].NET Core Identity using userManager and load additional ApplicationUser properties
我的问题基于此处的主题,但是由于不允许在此处添加评论,我想我必须打开一个新线程。
在我的ASP.NET Core后端中,我正在使用ASP.NET Core身份进行用户管理。 它在所谓的用户管理器的帮助下提供了用于用户身份验证的方法。
现在,我一方面无法使用用户管理器中的方法,另一方面却无法加载自定义的Application User属性。
方案如下:前端通过MVC控制器(HTTP请求)发送包含电子邮件地址和密码的登录dto。 现在,我想使用用户管理器提供的FindByEmailAsync
方法加载应用程序用户。 我将此方法包装在一个自制的应用程序用户存储库中,在该存储库中,用户管理器是通过依赖项注入来注入的,并且还可以访问应用程序上下文。 由于用户管理器在加载用户管理器时不会加载自定义属性,因此我也必须做一些额外的工作来加载这些属性。
我首先尝试通过上下文(而不是通过用户管理器)完全加载用户。 效果很好,其他属性也可以加载。 随后尝试使用usermanager.CheckPasswordAsync
方法时,问题开始。 我有一个例外:
“无法跟踪实体ApplicationUser的实例,因为已经跟踪了另一个具有相同键值的id的实例”。
我认为这是由于一方面使用上下文加载用户,而另一方面使用用户管理器执行checkPassword
。 然后,我尝试使用FindByEmailAsync
的usermanager
加载用户。 一切正常,没有异常,但是自定义属性尚未加载。 在我上面链接的线程中,有一些建议,但是没有一个对我有用。
建议:
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();
在我的情况下,自定义属性(Certificates)是一个集合,因此我使用.Collection
而不是.Reference
,但是出现以下错误:
“无法加载类型为'ApplicationUser'的实体上的导航属性'Certificates',因为该实体未被跟踪。只能为跟踪的实体加载导航属性。“
有人建议如何使用用户管理器提供的方法,并向应用程序用户包括自定义属性吗?
谢谢!
我遇到了同样的问题,并注意到当您访问自定义属性之前加载DbContext时,它可以工作
var user = await userManager.Users;
_context.Users.Include(u => u.Address).FirstOrDefault(x => x.NormalizedEmail == email);
var adress = user.Address;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.