Entity Framework 核心:列名无效 'UserId1'
Entity Framework Core : invalid column name 'UserId1'
我正在尝试使用 Entity Framework Core / .NET 5 与我的数据库进行交互。
当我尝试查询 DbContent.UserClaims
时,出现以下错误:
Microsoft.Data.SqlClient.SqlException (0x80131904): Invalid column name 'UserId1'.
我不确定 UserId1
我们来自哪里。我有一个名为 UserId
的 属性,它是外键。这是关系映射
这是我在 DbContext
class
中尝试做的
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);
});
}
这里是 UserClaim
class 派生自 IdentityUserClaim
public class UserClaim : IdentityUserClaim<string>
{
public virtual User User { get; set; }
}
这是从 IdentityUser
派生的 User
class
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 中解决这个问题?
您在这里使用了影子属性,除此之外,还试图将 UserId 外键添加到用户本身。由于 UserId 已在 class 中定义 属性,因此每次您尝试在用户 table 中添加外键时,它都会向 属性 名称添加后缀同名。
应该是这样的:
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 的其他一些方法。
我正在尝试使用 Entity Framework Core / .NET 5 与我的数据库进行交互。
当我尝试查询 DbContent.UserClaims
时,出现以下错误:
Microsoft.Data.SqlClient.SqlException (0x80131904): Invalid column name 'UserId1'.
我不确定 UserId1
我们来自哪里。我有一个名为 UserId
的 属性,它是外键。这是关系映射
这是我在 DbContext
class
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);
});
}
这里是 UserClaim
class 派生自 IdentityUserClaim
public class UserClaim : IdentityUserClaim<string>
{
public virtual User User { get; set; }
}
这是从 IdentityUser
派生的User
class
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 中解决这个问题?
您在这里使用了影子属性,除此之外,还试图将 UserId 外键添加到用户本身。由于 UserId 已在 class 中定义 属性,因此每次您尝试在用户 table 中添加外键时,它都会向 属性 名称添加后缀同名。
应该是这样的:
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 的其他一些方法。