如何让 EF6 遵守关联/关系多重性中的唯一约束(在 FK 上)



>2019 更新/TLDR;切换到实体框架核心(或其他任何内容)

虽然缺少一些"功能",但 EF Core 除了主键之外,还正确遵循备用键(也称为唯一约束),因此在支持关系代数方面做得更好。否则,YMMV ;至少它正确地支持更多的SQL方案。

添加的这种支持是在(非常过时的)EF Core 1.0版本中......有点令人失望的是,原始EF从未解决过这个设计(编辑!)缺陷。


这可能与我的另一个问题有关 - 这似乎是:

  1. 实体框架是一个可怕的关系代数映射器1 或;

  2. (我希望)我忽略了SSDL/CSDL和EDMX模型或EF映射的某些内容。

我有一个架构优先模型,架构如下所示:

ExternalMaps
---
emap_id - PK
Melds
---
meld_id - PK
emap_id - >>UNIQUE INDEX<< over not-null column, FK to ExternalMaps.emap_id

为了进行验证,这些脚本如下,这应该会导致多重性ExternalMaps:1 <-> 0..1:Melds 2

ALTER TABLE [dbo].[Melds] WITH CHECK ADD CONSTRAINT [FK_Melds_ExternalMaps]
FOREIGN KEY([emap_id]) REFERENCES [dbo].[ExternalMaps] ([emap_id])
CREATE UNIQUE NONCLUSTERED INDEX [IX_Melds] ON [dbo].[Melds] ([emap_id] ASC)

但是,当我使用 EDMX 设计器从头开始从数据库 (SQL Server 2012) 更新时,它会错误地将关联/外键关系创建为 ExternalMap:1 <-> M:Meld

当我尝试手动将 Meld(通过设计器中的"关联集"属性)端的多重性更改为 10..1 时,我得到:

运行转换:多重性在关系"FK_Melds_ExternalMaps"中的角色"融合"中无效。由于依赖角色属性不是关键属性,因此必须*依赖角色多重性的上限。

(与我的另一个问题一样,这似乎与唯一约束正确注册/作为候选键有关。

如何让 EF 遵守模型建立的1 <-> 0..1/1多重性


1 虽然我希望情况并非如此,但在尝试让 EF 映射到完全有效的 RA 模型时,我感到无尽的悲伤:LINQ to SQL (L2S) 没有这个问题。由于我的另一个问题对于如此流行的ORM来说没有得到简单的回答,因此我对这个工具失去了信心。

2 从设计上讲,FK 不是另一种方式:"虽然 shalt 没有可为空的外键。 - 也不是像 2009 年的这个答案所建议的那样,它是一个"共享"PK。

我使用的是 EF 6.1.1、VS 2013 旗舰版,并且不会使用任何"OO 子类型功能"——如果这会改变任何东西。


编辑叹息

多重性无效,因为依赖角色属性不是关键属性?(从 2011 年开始) - EF"Microsoft 认可的企业就绪"ORM 在

2014 2015 年仍然如此吗?

按照这个速度,下次有人问为什么不使用EF时,除了"LINQ to SQL工作得很好"之外,我会有很多原因。

问题是实体框架(从 EF4 到 EF6.1,谁知道多久)不"理解"唯一约束的概念以及它们所暗示的所有内容: EF 映射 代码优先,而不是关系代数 *叹息*

我的相关问题的这个答案提供了一个链接,指向添加缺失功能的请求并总结道:

..实体框架目前仅支持基于主键的引用约束,并且没有唯一约束的概念

这可以扩展到几乎所有处理唯一约束和候选键的领域,包括这个问题中提出的多重性问题。


如果公开讨论EF的这种严重限制并使其"众所周知",我会很高兴,特别是当EF被吹捧为支持Schema First和/或取代L2S时。从我的角度来看,EF 的核心是仅将代码优先映射(并支持)为一等公民。也许再过 4 年.

最新更新