实体框架核心:无效的列名“UserId1”
Posted
技术标签:
【中文标题】实体框架核心:无效的列名“UserId1”【英文标题】:Entity Framework Core : invalid column name 'UserId1' 【发布时间】:2021-11-22 17:29:34 【问题描述】:我正在尝试使用 Entity Framework Core / .NET 5 与我的数据库进行交互。
当我尝试查询 DbContent.UserClaims
时,我收到以下错误:
Microsoft.Data.SqlClient.SqlException (0x80131904):列名“UserId1”无效。
我不确定UserId1
我们来自哪里。我有一个名为UserId
的属性,它是外键。这是关系映射
这是我在 DbContext
类中尝试做的事情
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);
user.HasMany(x => x.UserClaims).WithOne().HasForeignKey(x => x.UserId);
user.HasMany(x => x.UserTokens).WithOne().HasForeignKey(x => x.UserId);
);
builder.Entity<UserClaim>(userClaim =>
userClaim.HasKey(r => r.Id);
userClaim.HasOne(r => r.User).WithOne().HasForeignKey<UserClaim>(x => x.UserId);
);
这是从IdentityUserClaim派生的UserClaim
类
public class UserClaim : IdentityUserClaim<string>
public virtual User User get; set;
这是从IdentityUser派生的User
类
public class User : IdentityUser<string>
public virtual ICollection<UserToken> UserTokens get; set;
public virtual ICollection<UserRole> UserRoles get; set;
public virtual ICollection<UserClaim> UserClaims get; set;
这是 EF5 正在生成的查询
SELECT [u].[Id], [u].[ClaimType], [u].[ClaimValue],[u].[UserId], [u].[UserId1]
FROM [UserClaims] AS [u]
如何在 Entity Framework Core 中解决此问题?
【问题讨论】:
【参考方案1】:您在这里使用影子属性,除此之外,还尝试将 UserId 外键添加到 User 本身。由于 UserId 是该类中已定义的属性,因此每次您尝试在用户表中添加同名外键时,它都会为属性名称添加后缀。
应该是这样的:
modelBuilder.Entity<UserClaim>()
.Property<int>("UserForeignKey");
modelBuilder.Entity<UserClaim>()
.HasOne(a => a.User)
.WithMany(b => b.UserClaims)
.HasForeignKey("UserForeignKey")
阅读the documentation,了解如何为阴影属性配置 Fluent API,以及使用 Fluent API 的其他一些方法。
【讨论】:
以上是关于实体框架核心:无效的列名“UserId1”的主要内容,如果未能解决你的问题,请参考以下文章