代码首先来自现有数据库的外键问题

时间:2015-05-28 04:44:06

标签: c# wpf entity-framework ef-code-first

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类中。

Model definition

但是,当我尝试调用以检索数据时,我点击了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作为外键?

1 个答案:

答案 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首先从数据库生成代码的选项。

相关问题