【问题标题】: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 作为整数属性?

标签: c# entity-framework foreign-keys


【解决方案1】:

EF 使用约定,如 Caius mentioned

在你的情况下:

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

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

【讨论】:

    猜你喜欢
    • 2020-07-08
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-20
    • 2021-12-18
    • 1970-01-01
    相关资源
    最近更新 更多