2019更新/ TLDR; 切换到Entity Framework Core(或其他任何方式)
在缺少某些“功能”的同时,EF Core除了主键外还适当地使用了替代键(又称唯一约束),因此在履行关系代数方面做得更好。YMMV否则;至少它正确支持了更多的SQL方案。
新增的支持是(非常过时的)EF Core 1.0版本..令人失望的是,原始EF从未解决过此设计(ed!)缺陷。
这可能与我的其他问题有关-似乎是:
实体框架是一个糟糕的关系代数映射器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
。
当我尝试手动(通过设计器中的“ Association Set”属性)将Meld的多重性更改为1
或时0..1
,我得到:
运行转换:多重性在关系“ FK_Melds_ExternalMaps”中的角色“ Meld”中无效。因为从属角色属性不是关键属性,所以从属角色多重性的上限必须为
*
。
(与我的其他问题一样,这似乎与唯一约束未正确注册/认可为候选键有关。)
如何获得EF尊重1 <-> 0..1/1
模型所确立的多重性?
1虽然我希望这不是,我想什么时候能得到EF映射到一个完全有效的RA模型没有结束悲痛的情况下:不的LINQ to SQL(L2S)不存在这个问题。由于对于如此受欢迎的ORM而言,我的另一个问题没有得到解答,因此我对这种工具失去了信心。
2 FK并非是设计使然:“尽管没有可为空的外键”。-也并非是“共享的” PK,因为2009年的答案暗示此为解决方案。
我正在使用EF 6.1.1,VS 2013 Ultimate,并且不会使用任何“ OO子类型功能”-如果这会发生任何变化。
编辑感叹:
多重性无效,因为从属角色属性不是关键属性?(从2011年开始)-EF的“ Microsoft认可的企业级” ORM仍然是这种情况2014年 2015年?
以这种速度,下次有人问为什么不使用EF时,除了“ LINQ to SQL可以正常工作”之外,我还有很多其他原因。
问题在于,实体框架(从EF4到EF6.1,并且知道更长的时间)不能“理解”唯一约束的概念及其所暗示的所有内容:EF映射代码优先,而不是关系代数*叹*
这个有关我的相关问题的答案提供了一个指向请求的链接,以添加缺少的功能并进行总结:
..实体框架当前仅支持基于主键的引用约束,而没有唯一约束的概念。
可以将其扩展到涉及唯一约束和候选键的几乎所有领域,包括此问题中引起的多重性问题。
如果公开讨论EF的这种严重局限性并使其“广为人知”,尤其是当EF被吹捧支持Schema First和/或替换L2S时,我将感到高兴。在我看来,EF的重点是仅映射(并支持)作为一流公民的Code First。也许再过4年..
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句