c# - 现有数据库中代码优先的外键问题

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

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 类中的 } 属性。

Model definition

但是,当我尝试调用检索数据时,我遇到了 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/

相关文章:

wpf - 如何在 C#/WPF 中的一行上有箭头符号?

entity-framework - 将类型映射到字符串

c# - 从 ObjectContext 转换为 DBContext

c# - 访问 ListView 的 LayoutTemplate 内的控件

c# - 用于在 C# 中的 .vdproj 文件中查找和替换任何产品名称值的 .NET 正则表达式

c# - 如何排查从 Azure Function 向 Azure Cosmos 插入缓慢的问题

wpf - 如何知道要在 FindWindowByClassName InnoSetup 函数中使用的 WPF 应用程序的类名

c# - 将多个文本框值绑定(bind)到单个属性

c# - Entity Framework 、AutoMapper、处理实体更新

c# - 如果元数据值为空,Azure Blob 存储的 ListBlobsSegmentedAsync 方法不会返回元数据