理解实体框架核心外键关系

Posted

技术标签:

【中文标题】理解实体框架核心外键关系【英文标题】:understanding entity framework core foreign key relationships 【发布时间】:2022-01-04 13:54:08 【问题描述】:

我第一次使用代码优先的方法(我以前总是首先使用数据库)并且我试图理解一些基本概念。如果我在两个实体之间创建外键关系,实体框架如何知道在关系的两侧使用哪些属性(列)?用一个简单的代码示例可能会更好地解释我的问题。我有两个实体,病人和治疗。一个病人可以有多个治疗,所以病人和治疗之间会有一对多的关系,两个实体之间存在外键关系。这是我的实体类。请注意,为了便于说明,这些都被大大简化了。

public class Patient

    public int Id  get; set; 
    public string FirstName  get; set; 
   
    public string LastName  get; set; 

    public ICollection<PatientTreatment> PatientTreatment  get; set; 


public class PatientTreatment

    public int Id  get; set; 
   
    public string TreatmentDescription  get; set; 

    public int PatientId  get; set; 
    public virtual Patient Patient  get; set; 

因此,对于患者实体,主键是 Id,对于 PatientTreatment 实体,其主键也是 Id

对于外键关系,根据我到目前为止搜索的内容,上面的代码将为我创建该关系,这是正确的吗?如果是这样,实体框架如何知道 PatientTreatment 中的 PatientId 与 Patient 实体中的 Id 相关联?这就是它应该在数据库(SQL Server)中的样子,但我看不出实体框架如何知道这一点。我对代码优先方法真的很陌生,所以我只是想了解它是如何工作的。谁能给我解释一下? 我还读到设置上述关系不会创建索引(PatientTreatment 中的 PatientId),因此这些也必须在代码中创建

【问题讨论】:

“Conventions”是您需要搜索的关键字,例如entityframeworktutorial.net/efcore/conventions-in-ef-core.aspx 所以约定是 PatientId 将自动用于从 PatientTreatment (PatientId) 到 Patient (Id) 的外键关系,因为我在类定义中包含了 Patient 实体以及 PatientId 作为整数属性? 【参考方案1】:

EF 使用约定,如 Caius mentioned。

在你的情况下:

EF 知道有两个实体对象 - PatientPatientTreatment,因为这些类存在 dbSet 和可选配置。 Patient 包含通向 PatientTreatment 的所谓导航属性 - 一个集合,但它可能是实现 IEnumerable 的大部分内容 - EF 假设您想要在这里创建关系。 Patient 有一个 Id 字段 - 按照命名约定,没有任何配置的 EF 将假定这是一个实体键。 PatientTreatment 也是如此 PatientTreatment 有一个指向单个 Patient 的导航属性 - 按照惯例,这再次告诉 EF,您希望这两个实体之间的关系是一对多的 - 一侧是集合,另一侧是单个引用.

按照惯例,即使PatientTreatment 中没有导航属性,也可以实现一对多 - 只是要清楚一点。

【讨论】:

以上是关于理解实体框架核心外键关系的主要内容,如果未能解决你的问题,请参考以下文章

同一列上具有多个外键的实体框架核心

自动检索实体框架外键关系模型

Mysql数据库安装使用教程11:实体表对应关系外键

实体框架核心外键不起作用

如何在实体框架中定义除默认方法之外的外键关系

带有外键的实体框架选择为空?