SQL异常:无效列名'ParentNavbarItemID'问题求助
嘿,我看你遇到了这个SQL无效列名的报错,结合你贴的NavbarItem.cs代码片段,大概率是Entity Framework(EF)处理父子导航关系时的映射问题,咱们来一步步捋清楚怎么解决:
首先说下问题根源:你的ParentNavbarItem类里定义了ICollection<ChildNavbarItem> Children这个子项集合,但ChildNavbarItem里既没有显式的外键属性,也没有指向父项的导航属性。EF默认会自动推断一个名为ParentNavbarItemID的外键列,可你的数据库里根本没这个列,自然就抛出“无效列名”的异常了。
下面给你几个针对性的解决办法,你根据自己的实际情况选:
如果数据库已经存在,且有自己的外键列
比如你的数据库里Child表的外键列叫ParentID,那你需要在ChildNavbarItem里显式添加外键属性和父项导航属性,再用注解或者Fluent API指定映射关系:
用数据注解的例子:public class ChildNavbarItem { public string ID { get; set; } public string ObjectID { get; set; } public string Controller { get; set; } // 外键属性,和数据库列名一致 public string ParentID { get; set; } // 父项导航属性,用ForeignKey注解关联外键 [ForeignKey("ParentID")] public ParentNavbarItem ParentNavbarItem { get; set; } // 其他未贴出的属性... }要是习惯用Fluent API,就在你的DbContext里配置:
protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<ChildNavbarItem>() .HasOne(c => c.ParentNavbarItem) // 子项关联的父项导航属性 .WithMany(p => p.Children) // 父项对应的子项集合 .HasForeignKey(c => c.ParentID); // 指定数据库里的外键列名 }如果是Code First模式,数据库还没生成/可以更新
那直接在ChildNavbarItem里添加EF默认预期的外键和导航属性就行,这样EF生成数据库时会自动创建正确的外键列:public class ChildNavbarItem { public string ID { get; set; } public string ObjectID { get; set; } public string Controller { get; set; } // 添加EF默认的外键属性 public string ParentNavbarItemID { get; set; } // 添加父项导航属性 public ParentNavbarItem ParentNavbarItem { get; set; } // 其他未贴出的属性... }之后执行EF迁移命令更新数据库:
Add-Migration AddNavbarForeignKey Update-Database记得先检查生成的迁移脚本,确认外键列的配置没问题再执行更新。
如果是修改实体后数据库没同步
要是你之前改了导航关系但没更新数据库,也会出现这个问题。这种情况直接用上面的迁移命令更新数据库就行,确保实体映射和数据库结构一致。
另外再提醒下:检查下两个实体有没有用[Table]注解指定了非默认的表名,要是表名映射错了,EF也会找不到正确的关联列哦。
备注:内容来源于stack exchange,提问作者Erck

