理解实体框架核心外键关系
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 知道有两个实体对象 -Patient
和 PatientTreatment
,因为这些类存在 dbSet 和可选配置。
Patient
包含通向 PatientTreatment
的所谓导航属性 - 一个集合,但它可能是实现 IEnumerable
的大部分内容 - EF 假设您想要在这里创建关系。
Patient
有一个 Id
字段 - 按照命名约定,没有任何配置的 EF 将假定这是一个实体键。 PatientTreatment
也是如此
PatientTreatment
有一个指向单个 Patient
的导航属性 - 按照惯例,这再次告诉 EF,您希望这两个实体之间的关系是一对多的 - 一侧是集合,另一侧是单个引用.
按照惯例,即使PatientTreatment
中没有导航属性,也可以实现一对多 - 只是要清楚一点。
【讨论】:
以上是关于理解实体框架核心外键关系的主要内容,如果未能解决你的问题,请参考以下文章