实体框架:一对多关系

4

我在Entity Framework模型关系方面遇到了一个设计问题

在edmx中,我有这个模型 EF Diagram

业务规则:

Participant可以有多个Roles,因此我创建了一个关系表ParticipantRoles,该表在ParticipantRole表上具有1对多的关系

问题: 为了获取参与者的角色值,我必须通过Participant->ParticipantRole->Role进行深入挖掘(请参见下面的JSON输出)

enter image description here

问题:

在EF中,如何设计表关系以绕过ParticipantsRole表。我想像这样访问角色Particant.Role而不是Participant.ParticipantsRole.Role


1
据我所知,如果从PareticipantsRole表中删除Id,则关系将自动映射为您想要的方式。当关系表具有除连接的表的键之外的其他列时,自动映射不会发生。 - forsvarir
如果我删除ParticipantsRole.Id,就会出现“表[dbo].[ParticipantsRoles]没有聚集索引”的错误。在此版本的SQL Server中,插入数据需要聚集索引。 - Linc Abela
EF支持聚集索引吗? - Linc Abela
顺便说一下,我正在使用SQL Azure。 - Linc Abela
尝试移除id并在剩余字段上创建复合主键。 - T I
你说过“一个参与者可以有多个角色”,那么Particant.Role的意思是什么?Particant.Role是一个集合吗? - Mohsen Heydari
1个回答

2
你说一个参与者可以有多个角色,而一个角色也可以有多个参与者。所以基本上这是一种多对多的关联。
实体框架只会映射纯粹的多对多关联(没有连接类),当连接表只有两个外键时。在你的情况下,如果表ParticipantsRole在生成模型时只包含由ParticipantId和RoleId组成的主键,那么ParticipantsRole类就不会被创建。你将拥有Participant.Roles和Role.Participants作为导航属性。
然而,模型已经生成了ParticipantsRole,并且你想摆脱它。(或者不摆脱,我会回到那里的)。
你可以这样做:
- 从类图中删除ParticipantRoles。 - 修改数据库表ParticipantRoles,使它只有两个FK列,两个列都组成主键。 - 从数据库更新模型,并在添加选项卡中选择ParticipantsRole。
这应该给你一个纯粹的多对多关联模型。
然而,在你这样做之前三思。M2m关联有一种进化成1-m-1关联的方式(就像现在一样)。原因是,迟早感觉到需要记录关联的数据,所以连接表必须有更多的字段并停止成为一个纯连接表。在你的情况下,我可以想象有一天参与者的角色必须有一个固定的顺序,或者一个标记为默认。在生产环境中,将m2m关联改为1-m-1关联可能是一项重大的改进。 - 需要考虑...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接