繁体   English   中英

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

[英]understanding entity framework core foreign key relationships

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

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),因此这些也必须在代码中创建

正如 Caius 所提到的,EF 使用约定。

在你的情况下:

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

即使在PatientTreatment中没有导航属性,Ofc 也可以按照惯例进行一对多 - 只是为了清楚起见。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM