【问题标题】:Entity Framework: One to Many relationship实体框架:一对多关系
【发布时间】:2013-11-24 00:22:27
【问题描述】:

我有一个关于实体框架模型关系的设计问题

我在 edmx 中有这个模型

业务规则:

一个Participant 可以有多个Roles,所以我创建了一个关系表ParticipantRoles,它在ParticipantRole 表上具有一对多关系

问题: 为了获得参与者的角色值,我必须深入了解Participant->ParticipantRole->Role(请参阅下面的 JSON 输出)

问题:

在EF中,如何设计表关系绕过ParticipantsRole表。我想以Particant.Role 而不是Participant.ParticipantsRole.Role 之类的方式访问角色

【问题讨论】:

  • 据我了解,如果您从 PareticipantsRole 表中删除 Id,则关系将自动按照您希望的方式映射。当关系表具有其他列而不是它所连接的表的键时,不会发生自动映射。
  • 如果我删除 ParticipantsRole.Id,我得到的表 [dbo].[ParticipantsRoles] 没有聚集索引。在此版本的 SQL Server 中插入数据需要聚集索引
  • EF 是否支持聚集索引?
  • 顺便说一句,我正在使用 SQL Azure
  • 尝试删除 id 并在剩余字段上创建复合主键。

标签: sql json entity-framework database-design relational-database


【解决方案1】:

你说一个Participant可以有多个Roles。当然,一个Role 可以有多个Participants。所以基本上这是一个多对多的关联。

当联结表只有两个外键时,实体框架只会映射纯多对多关联(没有连接类)。在您的情况下,如果表 ParticipantsRole 仅具有由 ParticipantIdRoleId 组成的主键在生成模型时,则不会创建类 ParticipantsRole .您将拥有 Participant.RolesRole.Participants 作为导航属性。

但是,模型是用ParticipantsRole 生成的,你想去掉它。 (或者不,我会回到那个)。

这是你可以做的:

  • 从类图中删除ParticipantRoles
  • 修改数据库表 ParticipantRoles,使其只有两个 FK 列,它们都构成主键。
  • 从数据库中更新模型并在“添加”选项卡中选择ParticipantsRole

这应该为您提供一个具有纯多对多关联的模型。

但是,在执行此操作之前请三思。 M2m 关联有一种演变为 1-m-1 关联的方式(正如您现在所拥有的那样)。原因是迟早会感到需要记录关于关联的数据,因此联结表必须有更多字段并且不再是纯粹的联结表。在你的情况下,我可以想象有一天参与者的角色必须有一个固定的顺序,或者一个标记为默认的。在生产环境中将 m2m 关联更改为 1-m-1 可能是一项重大改革。 - 需要考虑的事情...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-28
    • 2011-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-24
    • 1970-01-01
    相关资源
    最近更新 更多