c# - SqlClient.SqlException : Invalid column name ClassNameId While fetching data from Fluent API 异常

标签 c# sql entity-framework entity-framework-core ef-fluent-api

我是这个 EF 的新手,我正在尝试从 Sql Db 表中获取数据,但它给我错误,如 invalid classNameId 错误。

public class ClassName
{
        [Key]
        [Display(Name = "Id:")]
        public int Id { get; set; }

        [Display(Name = "Created By:")]
        [Required(ErrorMessage = "Please enter created by.")]
        [StringLength(5, MinimumLength = 2)]
        public string CreatedBy { get; set; }
        public List<OtherClass> OtherClassList{ get; set; }
}

public class OtherClass
{

        [Column("Control")]
        [Display(Name = "Control:")]
        public String Control { get; set; }

        [ForeignKey("PID")]
        [Column("PID")]
        [Display(Name = "PID:")]
        public int PID{ get; set; }
}

数据库上下文:

protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<ClassName>()
                .HasKey(p => p.Id);

            modelBuilder.Entity<OtherClass>()
            .HasKey(p=> new { p.Control, p.PID});
}

我使用 Fluent API 从 MSSql 获取数据。

最佳答案

问题是无效的ForeignKey注释在这里

[ForeignKey("PID")]
[Column("PID")]
[Display(Name = "PID:")]
public int PID{ get; set; }

ForeignKey是令人困惑的属性,因为它会根据应用的位置改变参数的含义。当应用于 FK 属性时,它表示导航属性的名称。当应用于导航属性时,它指示 FK 属性的名称。

在您的情况下,它应用于 FK 属性,但指定了相同的属性名称,因此它被简单地忽略并且 EF 使用与 List<OtherClass> OtherClassList 关联的 FK 属性的默认约定名称关系,这就是您获得不存在的列的原因。

要解决此问题,请将属性应用于其他类的导航属性(因为您在需要 FK 的类中没有导航属性):

[ForeignKey(nameof(OtherClass.PID))]
public List<OtherClass> OtherClassList{ get; set; }

或(最好)使用流畅的 API 配置它:

modelBuilder.Entity<ClassName>()
    .HasMany(e => e.OtherClassList)
    .WithOne()
    .HasForeignKey(e => e.PID);

如果你有引用导航属性,除了上面的数据注释解决方案,你还可以使用

    [ForeignKey(nameof(ClassName))]
    [Column("PID")]
    [Display(Name = "PID:")]
    public int PID{ get; set; }

    [ForeignKey(nameof(PID))]
    public ClassName ClassName { get; set; }

或流畅的 API .WithOne()必须改为 .WithOne(e => e.ClassName) .

关于c# - SqlClient.SqlException : Invalid column name ClassNameId While fetching data from Fluent API 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56864082/

相关文章:

c# - 如何检查FTP连接?

sql - T-SQL 递归查询 - 如何做?

c# - 选中复选框时 ASP.NET MVC 更改数据库值

c# - Entity Framework 相同类型的多个集合

c# - MEF——我似乎在这里遗漏了一些东西

c# - 在 UWP 中使用 DataTriggerBehavior 更改 ContentTemplate

sql - 鉴于此模式设计,我如何选择每个主题的最高帖子并将它们关联起来?

c# - Entity Framework 如何为主键值生成 GUID?

c# - 动态创建可空类型

java - 调用从 Java 返回 Oracle 类型的 PL/SQL 函数