EF从数据库优先转代码优先时出现'Invalid column name Contact_Contact_ID'错误
EF从数据库优先转代码优先时出现'Invalid column name Contact_Contact_ID'错误
看起来你遇到的这个错误是EF在映射多对多关系时,没正确识别外键列导致的——它自动生成了一个不存在的Contact_Contact_ID列名,而不是用你数据库里实际存在的Contact_ID。我帮你梳理下问题点和解决办法:
1. 明确外键与导航属性的关联
你的Contact_Category_Pivot类里的外键属性(Contact_ID、Contact_Category_ID)和对应的导航属性(Contact、Contact_Category)之间缺少明确的映射标记。EF有时候会依赖约定,但遇到列名和属性名不一致(比如Contact的主键数据库列是Contact ID,属性名是Contact_ID)时,就容易混淆。
修改Contact_Category_Pivot类,给外键属性加上[ForeignKey]特性:
public partial class Contact_Category_Pivot { [Column("ID")] [Key] public Guid PivotID { get; set; } [Column("Contact_ID")] [ForeignKey("Contact")] // 关联到Contact导航属性 public int Contact_ID { get; set; } [ForeignKey("Contact_Category")] // 关联到Contact_Category导航属性 public Guid Contact_Category_ID { get; set; } // 建议改成virtual,支持延迟加载(可选但推荐) public virtual Contact Contact { get; set; } public virtual Contact_Category Contact_Category { get; set; } }
2. 补全Fluent API配置
你在OnModelCreating里给Contact_Category的关联配置漏掉了外键指定,这也会让EF自行猜测列名。补充HasForeignKey:
modelBuilder.Entity<Contact_Category>() .HasMany(e => e.Contact_Category_Pivot) .WithRequired(e => e.Contact_Category) .HasForeignKey(e => e.Contact_Category_ID) // 明确指定外键 .WillCascadeOnDelete(false);
你的Contact的配置是正确的,不用修改,保持原样即可:
modelBuilder.Entity<Contact>() .HasMany(e => e.Contact_Category_Pivot) .WithRequired(e => e.Contact) .HasForeignKey(e => e.Contact_ID);
3. 验证与测试
修改完后,重新运行你的查询代码:
Contact_Category CG = db.Contact_Category.Find(new Guid("a2ab17df-5a15-4b38-aa5f-4577653a1ec9"));
这时候EF应该能正确识别外键列,不会再报找不到Contact_Contact_ID的错误了。
关于迁移的额外说明(你的Bonus问题)
因为你是基于现有数据库转代码优先,初始迁移需要特殊处理,避免EF试图重新创建已经存在的表:
- 确保你的DbContext连接字符串指向正确的现有数据库。
- 在Package Manager Console里运行:
这个命令会生成一个空的迁移文件,它会忽略当前模型和数据库的差异,只把迁移记录写入数据库的Add-Migration InitialCreate -IgnoreChanges__MigrationHistory表。 - 接着运行:
完成后,你就可以正常创建后续的迁移(比如修改模型后运行Update-DatabaseAdd-Migration xxx),EF会正确识别模型变化并生成对应的SQL脚本。
备注:内容来源于stack exchange,提问作者Ego Placebo
相关产品推荐
相关产品推荐

