tl; dr我是否需要在EF代码优先的相关类中将外键id字段作为属性?
在ScottGu的advice之后,我创建了一个反映现有数据库的模型。 db中的两个表是:具有外键关系的Project和ProjectType。每个项目都有一个ProjectType。
我已将必要的虚拟字段添加到模型类中以反映关系:
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 { get; set; }
属性在Project类中。
但是,当我尝试调用以检索数据时,我点击了EntityCommandExecutionException
,其内部异常为:Invalid column name 'ProjectType_ProjectTypeID'
初始谷歌搜索建议在ProjectType属性中添加[ForeignKey]注释。我尝试了[ForeignKey("ProjectType")]
和[ForeignKey("ProjectTypeID")]
,但都没有效果。
进一步的谷歌搜索建议使用FluentAPI调用:
modelBuilder.Entity<Project>().HasRequired<ProjectType>(p => p.ProjectType)
.WithMany(pt => pt.Projects)
在OnModelCreating
方法中,但这会导致Invalid column name
错误。
那么,我是否需要将ProjectTypeID字段作为Project类中的属性?如果没有,我如何告诉EF使用ProjectTypeID作为外键?
答案 0 :(得分:2)
现有数据库中的外键列名是什么?您不需要添加外键字段,但需要配置modelBuilder
以使外键名称匹配。
modelBuilder.Entity<Project>()
.HasRequired<ProjectType>(p => p.ProjectType)
.WithMany(pt => pt.Projects)
.Map(p => p.MapKey("FK_NAME_IN_EXISTING_DB"));
您还可以选择让EF首先从数据库生成代码的选项。