c# - .NET Core Identity 使用 userManager 并加载其他 ApplicationUser 属性
问题描述
我的问题是基于这里的主题,但由于我不允许在那里添加评论,我想我必须打开一个新线程。
在我的 ASP.NET Core 后端中,我使用 ASP.NET Core Identity 进行用户管理。它在所谓的用户管理器的帮助下提供了用户认证方法。
我现在一方面在使用用户管理器中的方法,另一方面在加载自定义应用程序用户属性方面遇到了麻烦。
场景如下:前端通过 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();
在我的情况下,自定义属性(证书)是一个集合,所以我使用.Collection
而不是.Reference
,但出现以下错误:
“无法加载‘ApplicationUser’类型实体上的导航属性‘证书’,因为该实体未被跟踪。导航属性只能为被跟踪的实体加载。”
是否有人建议如何使用用户管理器提供的方法并将自定义属性包括给应用程序用户?
谢谢!
解决方案
我遇到了同样的问题,并注意到在访问自定义属性之前加载 DbContext 时它可以工作
var user = await userManager.Users;
_context.Users.Include(u => u.Address).FirstOrDefault(x => x.NormalizedEmail == email);
var adress = user.Address;
推荐阅读
- javascript - 在 Map reactJS 中使用 if 语句时出错
- python - ModuleNotFound 导入脚本
- infinispan - 每个 Infinispan 缓存属性
- javascript - Chart.js 用于不同 y 轴的一个通用组件与 React.js
- python - 我可以通过单击 messagebox.showinfo 中的“确定”来调用函数吗?
- html - 如何“成长”父母以适应使用绝对定位和 z-index(覆盖)的大孩子?
- google-apps-script - Google Sheet(脚本)将Sheet复制到另一个SpreadSheet并在目标SS中命名新工作表
- google-apps-script - 循环从日期列表中为列表中的每个 ID 创建日期值
- inno-setup - 使用 Inno Setup 将 exe 文件注册为 OLE 服务器
- python - 全量化不排除 int8 数据将模型输入层更改为 int8