如何修复 ApplicationUserManager 中的“LINQ to Entities 中不支持指定的类型成员‘UserId’”
Posted
技术标签:
【中文标题】如何修复 ApplicationUserManager 中的“LINQ to Entities 中不支持指定的类型成员‘UserId’”【英文标题】:How to fix "The specified type member 'UserId' is not supported in LINQ to Entities" in ApplicationUserManager 【发布时间】:2020-10-07 18:45:11 【问题描述】:我目前正在开发一个较旧的 MVC 5 网站,该网站最初使用带有实体框架的代码优先生成的数据库。它已被转换为 db-first,重构,我现在正在删除旧的实体 c# 文件并用 ADO.net 的实体框架替换它们。
我目前遇到的问题是在登录时,我在 ApplicationUserManager(它派生自 UserManager(TUser, TKey))中点击了以下行:
var user = await UserManager.FindByEmailAsync(model.Email);
我收到以下错误: "LINQ to Entities 不支持指定的类型成员 'UserId'。仅支持初始化程序、实体成员和实体导航属性。"
镜像 db 表的 ApplicationUser 实体使用变量“Id”而不是“UserId”。我覆盖了有问题的方法并且它有效,但是每当我们需要使用 UserManager 时我不想这样做。所以我想我很困惑,UserManager 是否需要将变量命名为“UserId”?如果没有,我怎么能告诉它使用'Id'?
我认为我没有遗漏任何东西(比如在某处的 LINQ 语句中意外添加了“UserId”)。
【问题讨论】:
你玩过[Column("your db column name here")]
这个属性吗?如果我理解正确,您需要将您的类属性映射到正确的数据库列名,对吗?
所以我使用 ADO.net 实体框架自动生成实体类。我不认为建议手动更改课程中的任何内容。也许我可以通过 edmx 以某种方式做到这一点?
【参考方案1】:
这就是我正在做的事情,到目前为止它似乎正在工作。在 ApplicationUserManager 的 Create 方法中,而不是
var manager = new ApplicationUserManager(new UserStore<ApplicationUser, ApplicationUserRole, int, ApplicationLogin, ApplicationRole, ApplicationClaim>(context.Get<AppDbContext>()));
我创建了一个派生自多个身份接口的 CustomUserStore:
var manager = new ApplicationUserManager(new CustomUserStore(context.Get<AppDbContext>()));
开头是这样的:
public class CustomUserStore : IUserStore<ApplicationUser, int>,
IUserEmailStore<ApplicationUser, int>,
IUserRoleStore<ApplicationUser, int>,
IUserPasswordStore<ApplicationUser, int>,
IQueryableUserStore<ApplicationUser, int>,
IUserLockoutStore<ApplicationUser, int>,
IUserLoginStore<ApplicationUser, int>,
IDisposable
public IQueryable<ApplicationUser> Users => ctx.ApplicationUsers;
private AppDbContext ctx get; set;
public CustomUserStore(AppDbContext _ctx)
ctx = _ctx;
然后我重写所有必要的方法。这不是我最初想要的,但现在可以了。
【讨论】:
以上是关于如何修复 ApplicationUserManager 中的“LINQ to Entities 中不支持指定的类型成员‘UserId’”的主要内容,如果未能解决你的问题,请参考以下文章