Entity Framework Core报错Invalid column name 'UserId1'如何解决?
EF Core 无效字段UserId1报错修复方案
错误根因
多余字段UserId1是EF Core自动生成的阴影外键,触发原因是你对User和UserClaim的导航关系配置冲突:
- 在
User实体配置中,你定义的是一对多关系:user.HasMany(x => x.UserClaims).WithOne(),即一个用户对应多个用户声明 - 在
UserClaim实体配置中,你定义的是一对一关系:userClaim.HasOne(r => r.User).WithOne(),即一个用户对应一个用户声明
两种不匹配的关系配置导致EF无法匹配你显式声明的UserId外键,只能自动生成新的外键字段UserId1,最终触发查询时字段不存在的报错。
修复步骤
- 调整关系配置,保证两端配置一致,推荐直接删除
UserClaim侧冲突的一对一配置,修改后的OnModelCreating代码如下:
protected override void OnModelCreating(ModelBuilder builder) { base.OnModelCreating(builder); builder.Entity<User>(user => { user.HasKey(r => r.Id); user.HasMany(x => x.UserRoles).WithOne().HasForeignKey(x => x.UserId); // 补充WithOne的导航属性参数,让关系映射更明确 user.HasMany(x => x.UserClaims).WithOne(u => u.User).HasForeignKey(x => x.UserId); user.HasMany(x => x.UserTokens).WithOne().HasForeignKey(x => x.UserId); }); // 移除下方冲突的UserClaim配置即可 // builder.Entity<UserClaim>(userClaim => // { // userClaim.HasKey(r => r.Id); // userClaim.HasOne(r => r.User).WithOne().HasForeignKey<UserClaim>(x => x.UserId); // }); }
如果你需要保留UserClaim的单独配置,就将其关系修改为和User侧匹配的一对多即可:
builder.Entity<UserClaim>(userClaim => { userClaim.HasKey(r => r.Id); userClaim.HasOne(r => r.User).WithMany(u => u.UserClaims).HasForeignKey(x => x.UserId); });
- 删除项目中旧的迁移文件,重新执行
Add-Migration和Update-Database命令生成新的迁移更新数据库即可,后续查询不会再出现多余的UserId1字段。
内容的提问来源于stack exchange,提问作者Jay
相关产品推荐
相关产品推荐

