Entity Designer是否支持与重复关联数据的多对多关系?

时间:2013-05-14 19:23:19

标签: c# sql sql-server asp.net-mvc entity-framework

包A有一个桌面Y和一个监视器Z.包B有一个桌面Y和两个监视器Z.我想在Entity Designer创建的数据库中表示该关系。

StandardPackageStandardMachine(包括台式机,显示器,笔记本电脑等)之间存在多对多关系。每个季度,我们都会更新我们的包裹,客户下订单。他们选择一个包,当下订单时,该包StandardMachines将他们的数据(类型,品牌,型号等)转储到新创建的Machines

问题在于实体设计器为StandardPackageStandardMachine关系创建联结表的方式。联结表有两列对应于关系两端记录的ID,联结表的主键是这两个ID的组合。因此,对于第一段中的示例,如果Package A的Id为1,则Package B的Id为2,Desktop Y的Id为1,Monitor Z的Id为2,我需要的是

StandardPackageId | StandardMachineId
------------------|------------------
         1        |         1        
         1        |         2
         2        |         1
         2        |         2
         2        |         2

但显然你不能有两张2/2记录。

是否有一种很好的方式告诉实体设计器我打算做什么,以便它将为联结表创建一个自动递增的主键列?或者我是否必须自己手动创建联结表并自行处理关联?

顺便说一句,如果有人甚至知道如何改写我的问题标题,请这样做。

2 个答案:

答案 0 :(得分:1)

  

或者我是否必须自己手动创建联结表并自行处理关联

是的,你有。因为表不是联结表,而是实体。

多对多关联的语义与您想表达的语义略有不同。常规n:m关联表中的一条记录表示“A与B相关”。在你的表中,它表​​示“A有一个B实例”。

前面的表达在重复时总是多余的:“A与B有关” - 好吧,我们知道。后者不是:“A有另一个B实例”。因此,有两个不同的实例,这意味着每个实例都有一个标识。身份是实体的核心概念。

所以StandardPackageStandardMachine只是一个常规类,代表一个包中的机器实例,即使它仍然是一个“虚拟机”。

答案 1 :(得分:1)

您通常要做的是创建主/细节关系。

我不确定你正在做什么的背景。通常,您的包将具有1:多个Package:Items的关联,每个项目行将具有它自己的行号(有时称为序列号),并且它将与product表具有外键关系。即,像这样:

ID Name
1  Package A
2  Package B

ID PkgID Line(Seq) PrdID
1  1     1         1 
2  1     2         1
3  1     3         2
4  2     1         1
5  2     2         2

ID Name
1  Monitor Y
2  Desktop Z

通过这种方式,您可以拥有任意数量的单一类型。 ID与行的原因是每个订单的行号重复,而ID是表的唯一键。或者,您可以创建PkgID和Line的复合键。