2019年更新/ TLDR;切换到实体框架核心(或其他任何)
虽然缺少一些“功能”,但EF Core除了主键之外还适当地支持备用键(也称为唯一约束),因此可以更好地兑现关系代数。否则YMMV;至少它正确支持更多的SQL方案。
这个支持增加了(非常过时的)EF Core 1.0 release ..有点令人失望的是,最初的EF从未有过这个设计(编辑!)的缺陷。
这可能与我的other question有关 - 这似乎是:
我有一个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'中无效。由于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工作正常”之外,还有很多原因。
问题是实体框架(从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年..