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

问题描述 投票:15回答:1

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

虽然缺少一些“功能”,但EF Core除了主键之外还适当地支持备用键(也称为唯一约束),因此可以更好地兑现关系代数。否则YMMV;至少它正确支持更多的SQL方案。

这个支持增加了(非常过时的)EF Core 1.0 release ..有点令人失望的是,最初的EF从未有过这个设计(编辑!)的缺陷。


这可能与我的other question有关 - 这似乎是:

  1. 实体框架是一个糟糕的关系代数mapper1或;
  2. (我希望这样)我忽略了SSDL / CSDL和EDMX模型或EF映射。

我有一个Schema First模型,模式如下所示:

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:Melds2。

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'中的角色'Meld'中无效。由于Dependent Role属性不是关键属性,因此Dependent Role的多重性的上限必须为*

(与我的另一个问题一样,这似乎与Unique Constraints没有正确注册/荣誉为候选密钥有关。)

我怎样才能让EF尊重1 <-> 0..1/1多样性,正如模型所建立的那样?


1虽然我希望事实并非如此,但是当我试图让EF映射到一个完全有效的RA模型时,我无法忍受悲伤:LINQ to SQL(L2S)没有这个问题。由于我的另一个问题并没有得到如此流行的ORM的轻易回答,我对这个工具失去了信心。

2按照设计,FK不是另一种方式:“你不能有可空的外键。” - 它也不是一个“共享”PK,因为这个qazxsw poi建议修复。

我正在使用EF 6.1.1,VS 2013 Ultimate,并且不会使用任何“OO子类型功能” - 如果这改变了什么。


编辑叹息:

answer from 2009(自2011年起) - 这仍然是EF“微软认可的企业级”ORM的情况 2014 2015年?

下次当有人问为什么不使用EF时,我会有这么多的原因,除了“LINQ to SQL工作正常”之外,还有很多原因。

entity-framework entity-framework-6 foreign-keys unique-key multiplicity
1个回答
18
投票

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

Multiplicity is not valid because the Dependent Role properties are not the key properties?为我的相关问题提供了This answer的链接并总结:

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

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


如果公开讨论EF的严重限制并使其“众所周知”,我会很高兴,特别是当EF被吹捧为支持Schema First和/或取代L2S时。从我的观点来看,EF主要围绕映射(和支持)Code First作为一等公民。也许在另外4年..

© www.soinside.com 2019 - 2024. All rights reserved.