EF代码首先没有实体的多对多关系

时间:2013-02-23 09:25:08

标签: entity-framework-5 code-first junction-table

我已经阅读了很多关于如何使用EF Code First和流畅配置配置多对多关系的知识。但我无法理解为什么我应该为联结表创建一个额外的实体。让我们假设我有以下实体:

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

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

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

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

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

因此,在EF Code First中是否可以在没有额外实体的情况下流畅地配置这种关系?

1 个答案:

答案 0 :(得分: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)};