tl;dr 我是否需要有一个外键 id 字段作为具有 EF 代码优先的相关类中的属性?
关注 ScottGu 的 advice ,我创建了一个模型来反射(reflect)现有数据库。数据库中的两个表是:具有外键关系的 Project 和 ProjectType。每个项目都有一个项目类型。
我已将必要的虚拟字段添加到模型类中以反射(reflect)关系:
public class Project {
public int ProjectID { get; set; }
public string ProjectName { get; set; }
public DateTime CreationDate { get; set; }
...
public virtual ProjectType ProjectType {get; set; }
...
}
public class ProjectType {
public int ProjectTypeID { get; set; }
...
public virtual ICollection<Project> Projects { get; set;}
...
}
根据 Scott 的说法(如下图所示),不需要在依赖类中公开实际的(外键)ID 字段,即我不需要 public int ProjectTypeID { 得到;放; Project 类中的 }
属性。
但是,当我尝试调用检索数据时,我遇到了 EntityCommandExecutionException
,其 InnerException 为:无效的列名称“ProjectType_ProjectTypeID”
最初的谷歌搜索建议向 ProjectType 属性添加 [ForeignKey] 注释。我尝试了 [ForeignKey("ProjectType")]
和 [ForeignKey("ProjectTypeID")]
但都不起作用。
进一步谷歌搜索建议使用 FluentAPI 并调用:
modelBuilder.Entity<Project>().HasRequired<ProjectType>(p => p.ProjectType)
.WithMany(pt => pt.Projects)
在 OnModelCreating
方法中,但这会因相同的无效列名
错误而失败。
那么,我是否需要将 ProjectTypeID 字段作为 Project 类中的属性?如果没有,我如何告诉 EF 使用 ProjectTypeID 作为外键?
最佳答案
现有数据库中的外键列名称是什么?您不需要添加外键字段,但需要配置 modelBuilder
以使外键名称匹配。
modelBuilder.Entity<Project>()
.HasRequired<ProjectType>(p => p.ProjectType)
.WithMany(pt => pt.Projects)
.Map(p => p.MapKey("FK_NAME_IN_EXISTING_DB"));
您还可以选择让 EF 首先从数据库生成代码的选项。
关于c# - 现有数据库中代码优先的外键问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30497423/