【问题标题】:Entity Framework Code First unique constraint across multiple tables跨多个表的实体框架代码优先唯一约束
【发布时间】:2015-05-26 20:46:49
【问题描述】:

所以我正在使用 Entity Framework 的 Code First 范例创建一个数据库模型,并且我正在尝试创建两个必须共享唯一性的表(Players 和 Teams)关于他们的主键的约束。

例如,我有 3 个 ID 为 “1”、“2” 和 “3” 的玩家,当我尝试创建一个 ID 为 的团队时“2”,系统应该验证唯一性并失败,因为已经存在 ID 为 “2” 的玩家。

这可以通过数据注释实现吗?如果有帮助,这两个实体共享一个名为 IParticipant 的通用接口!

小伙子们提前发消息!

【问题讨论】:

  • GUID 的使用通常用于存档目的,但在您的情况下,我不太明白为什么您需要为 2 个特定表提供唯一 ID。您能否向我们详细说明如何使用此唯一 ID?否则我认为克莱斯是对的。如果你真的需要这样做,它应该可以在你的构造函数中手动完成,但我认为数据注释不支持这样的事情。

标签: entity-framework unique data-annotations code-first unique-constraint


【解决方案1】:

您在此处描述的场景并不理想。这并不是对实体框架的真正限制;它更多的是对数据库堆栈的限制。默认情况下,Id 主键是一个标识列,SQL 本身并不真正支持“共享”标识列的想法。您可以禁用 Identity 并自行管理 Id 属性,但 Entity Framework 无法自动为您的实体构建导航属性。

这里的最佳选择是使用单个participant 表,采用一种称为“按层次结构表”或TPH 的技术。 Entity Framework 可以使用内部鉴别器列管理单个表。共享属性可以放在基类中,非共享属性可以放在各个类中,Entity Framework 将它们组合成数据库中的单个大表。此策略的主要缺点是非共享属性的列将在数据库中自动为空。 This article 很好地描述了这个场景。

我越想提出解决方案,我意识到这是XY Problem 的一个例子。这个问题并没有真正好的解决方案,因为这个问题已经是一个建议的解决方案。这里有一个问题导致您创建一个接口,您建议要求使用该接口的实体具有唯一的Id。这听起来确实像是接口本身设计的问题,因为接口应该与它们所应用的实体无关。也许提供一些代码并显示您的 problem 实际是什么会有所帮助,因为您在此处询问如何实施的建议 solution 并不实际。

【讨论】:

  • Txs 快速回复!我会调查 TPH,如果它恰好解决了我的问题,我会将其标记为答案:) 问题是我有一个系统,我的参与者可以是团队和球员,我希望能够查询每个参与者的分数,提供一个唯一的 ID,如果有一个球员的比赛,我可以确信不会有一个球队的比赛。这只能在两种类型的 ID 都是唯一的情况下才能完成。因此,您的 TPH 解决方案似乎与此相符,我会尽快调查:)
猜你喜欢
  • 2021-01-05
  • 1970-01-01
  • 2011-05-23
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-20
相关资源
最近更新 更多