EF Code First 没有实体的多对多关系

Posted

技术标签:

【中文标题】EF Code First 没有实体的多对多关系【英文标题】:EF Code First Many to Many Relation Without an Entity 【发布时间】:2013-02-23 09:25:08 【问题描述】:

我已经阅读了很多关于如何使用 EF Code First 和流畅配置来配置多对多关系的信息。但我不明白为什么要为联结表创建一个额外的实体。假设我有以下实体:

Department
----------
Id
Name

Material
----------
Id
Name

现在我想保留每个部门的材料记录。所以我需要

DepartmentMaterial
-------------------
DepartmentId
MaterialId
Quantity

到目前为止,我所阅读的内容需要 3 个实体:Department、Material 和 DepartmentMaterial。所以实际上我将每个表映射到一个相应的实体,这在我开始学习 DDD 时并不是我打算做的。我假设 EF 将自动映射该连接表,并且可以通过 Department 完成有关材料数量的查询。

因此,是否可以在 EF Code First 中流畅地配置这种关系而无需额外的实体?

【问题讨论】:

【参考方案1】:

如果联结表只有有两个外键 (DepartmentId, MaterialId),它就可以远离概念模型(类模型)。您想记录一些关于关联的数据。没关系,数量属于那里。一个部门有数量x的材料y。说一个部门有数量是没有意义的。

这不违反 DDD 原则。关联类是类模型中的一等公民。它甚至可以有自己的行为(例如限制某些部门/材料组合的数量)。

这意味着您的模型将不包含多对多关联,而是包含Department 1-n DepartmentMaterial n-1 Material。还要通过联结表查询部门资料。这是很常见的情况。我在现实生活中几乎看不到纯接线表。它们是收藏品。

查询示例:

var query = from d in db.Departments
            from dm in d.DepartmentMaterials
            select new  Department = d, Materials = dm.Select(x => x.Material);

【讨论】:

以上是关于EF Code First 没有实体的多对多关系的主要内容,如果未能解决你的问题,请参考以下文章

与 Code First Entity Framework 的单向多对多关系

使用流利的 api EF Core 5 的多对多关系

EF Core 5.0 - 更新 ASP.NET Core Web API 中的多对多实体

定义引用同一个表的多对多关系(EF7/core)

如何直接填充由 EF Core 生成的多对多关系连接表?

创建实体模型多对多 CodeFirst Ef6