了解 entity framework 核心外键关系

understanding entity framework core foreign key relationships

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

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

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

EF 按照惯例工作,如 Caius .

你的情况:

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

即使在 PatientTreatment 中没有导航 属性,按照惯例也可以实现一对多 - 明确一点。