C# 实体设计器是否支持具有重复关联数据的多对多关系?

C# 实体设计器是否支持具有重复关联数据的多对多关系?,c#,sql,sql-server,asp.net-mvc,entity-framework,C#,Sql,Sql Server,Asp.net Mvc,Entity Framework,包A有一个桌面Y和一个监视器Z。包B有一个桌面Y和两个监视器Z。我想在实体设计器创建的数据库中表示这种关系 StandardPackage和StandardMachine之间存在多对多关系(它有台式机、显示器、笔记本电脑等)。每个季度,我们都会更新我们的套餐,客户也会下订单。他们选择一个包,下订单时,该包的标准机器将其数据(类型、品牌、型号等)转储到新创建的机器 问题在于实体设计器为StandardPackageStandardMachine关系创建连接表的方式。连接表有两列,对应于关系两端记录

包A有一个桌面Y和一个监视器Z。包B有一个桌面Y和两个监视器Z。我想在实体设计器创建的数据库中表示这种关系

StandardPackage
StandardMachine
之间存在多对多关系(它有台式机、显示器、笔记本电脑等)。每个季度,我们都会更新我们的套餐,客户也会下订单。他们选择一个包,下订单时,该包的
标准机器
将其数据(类型、品牌、型号等)转储到新创建的
机器

问题在于实体设计器为
StandardPackageStandardMachine
关系创建连接表的方式。连接表有两列,对应于关系两端记录的ID,连接表的主键是这两个ID的组合。因此,对于第一段中的示例,如果包A的Id为1,包B的Id为2,桌面Y的Id为1,监视器Z的Id为2,那么我需要的是

StandardPackageId | StandardMachineId
------------------|------------------
         1        |         1        
         1        |         2
         2        |         1
         2        |         2
         2        |         2
但很明显,你不能有两个2/2的记录

有没有一种好方法可以告诉Entity Designer我打算做什么,以便它为连接表创建一个自动递增的主键列?或者我必须求助于手动创建连接表并自己处理关联吗

顺便说一下,如果有人知道如何重新表述我的问题标题,请这样做

或者我必须求助于手动创建连接表并自己处理关联吗

是的,你有。因为该表不是连接表,而是一个实体

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

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


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

通常要做的是创建一个主/详细关系

我不知道你在做什么。通常,您的包将有一个1:many的package:Items关联,每个item行都有自己的行号(有时称为序列号),并且它与产品表具有外键关系。例如,类似这样的:

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 vs行的原因是每个订单的行号都是重复的,而ID是表的唯一键。或者,您可以创建PkgID和Line的复合键。

核心问题是您的
监视器Z
不是一个实体,而是一个类。@HenkHolterman不,监视器Z是
标准机器的一个实例
,如果是,它不能同时在两个包中。从你的使用情况来看,它是StandardMachine的一个子类。当然可以。监视器Z是数据库中特定的
标准机器
。我把它叫做monitorz纯粹是为了参考。通过多对多关系,任何数量的软件包都可以包含Monitor Z。更准确地说,任何数量的
StandardPackages
都可以引用(通过连接表)我称之为Monitor Z的特定
StandardMachine
。如果它是(Monitor)的一个实例,您将两次销售一个项目。