2013-02-23 98 views
0

我已经阅读了很多关于如何使用EF Code First和流畅的配置来配置多对多的智能关系。但我不明白为什么我应该为交接表创建一个额外的实体。让我们假设我有以下实体:EF代码第一多对多关系没有实体

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)}; 
相关问题