实体框架核心:无效的列名“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”的主要内容,如果未能解决你的问题,请参考以下文章

实体框架无效的列名

实体框架 - 列名“*_ID”无效

实体框架创建列名比预期长的数据库

实体框架代码优先自加入,'多重性在角色中无效'

实体框架 - 无效的列名称'* _ID“

为啥实体框架核心加载实体的关系而不添加包含