gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 10:30:04 24 4
gpt4 key购买 nike

tl;dr 我是否需要使用 EF 代码优先将外键 ID 字段作为相关类中的属性?


关注 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 { 得到;放; 项目类中的属性。

Model definition

但是,当我尝试调用检索数据时,我遇到了一个 EntityCommandExecutionException,其 InnerException 为: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 作为外键?

最佳答案

现有数据库中的外键列名是什么?您不需要添加外键字段,但您需要配置您的 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com