2019更新/ TLDR;切换到实体框架核心(或其他任何)
虽然缺少一些“功能”,但除了主键外,EF Core还能正确地使用备用键(也称为唯一约束),因此很多可以更好地履行关系代数。否则YMMV;至少它正确支持更多的SQL方案。
这个支持增加了(非常过时的)EF Core 1.0 release ..有点令人失望的是,最初的EF从来没有解决过这个设计(编辑!)缺陷。
这可能与我的other question有关 - 这似乎是:
实体框架是一个可怕的关系代数映射器 1 或;
(我希望)我通常会忽略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: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(通过设计师中的“关联集”属性)手动更改多重性时,1
或0..1
,我得到:
运行转换:多重性在关系'FK_Melds_ExternalMaps'中的角色'Meld'中无效。由于“从属角色”属性不是关键属性,因此从属角色的多重性的上限必须为
*
。
(与我的其他问题一样,这似乎与唯一约束 正确注册/荣誉为候选密钥有关。)
我如何让EF遵守由模型建立的1 <-> 0..1/1
多样性?
1 虽然我希望情况并非如此,但是当我试图让EF映射到一个完全有效的RA模型时,我无法忍受悲伤:LINQ to SQL(L2S)做不有这个问题。由于我的另一个问题并没有得到如此流行的ORM的轻易回答,我对这个工具失去了信心。
2 根据设计,FK不是另一种方式:“虽然没有可空的外键。” - 它是不这是一个“共享”PK的情况,因为answer from 2009建议修复。
我正在使用EF 6.1.1,VS 2013 Ultimate,并且不将使用任何“OO子类型功能” - 如果这会改变任何内容。
编辑叹息:
Multiplicity is not valid because the Dependent Role properties are not the key properties?(自2011年起) - 2014 2015中的EF“微软认可的企业级”ORM 仍 p>
下次当有人问到为什么不使用EF时,我会有这么多的原因除了“LINQ to SQL工作得很好”之外还有很多原因。
答案 0 :(得分:18)
问题是实体框架(从EF4到EF6.1,谁知道多久)并不“理解”唯一约束的概念及其所暗示的一切:EF映射代码优先,而不是关系代数 *叹*
This answer我的相关问题提供了a request to add the missing functionality的链接并总结了它:
..当前的实体框架仅支持基于主键的引用约束,并且没有唯一约束的概念。
这可以扩展到处理独特约束和候选键的所有领域,包括在这个问题中提出的多重性问题。
如果公开讨论EF的严重限制并使其“众所周知”,我会很高兴,特别是当EF被吹捧为支持Schema First和/或取代L2S时。从我的观点来看,EF主要围绕映射(和支持)Code First作为一等公民。也许再过4年......