2019更新 / TLDR; 切换到Entity Framework Core(或其他)
尽管缺少一些“功能”,EF Core除了主键外,正确使用替代键(又称唯一约束条件),因此在遵循关系代数方面做得更好。否则,则可能会因情况而异;至少它正确支持许多SQL架构。
此支持已添加到(非常过时的)EF Core 1.0发布版中。有点令人失望的是,原始EF从未解决这个设计(约束!)缺陷。
这可能与我的其他问题有关 - 看起来要么是:
Entity Framework是一个可怕的关系代数映射器1或;
(我希望如此)我忽略了SSDL / CSDL和EDMX模型或EF映射中的某些内容。
我有一个基于Schema的模型,模式看起来像这样:
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外键不是双向的设计方式:“你不应该有可空外键。” - 它也不是共享的PK,就像2009年的答案所提出的那样。
我使用EF 6.1.1,VS 2013 Ultimate,并且不会使用任何“OO子类型功能” - 如果有任何更改,请告诉我。
编辑叹气:
从属角色属性不是关键属性,因此多重性无效?(来自2011) - 在2015年,“微软认可的企业级”ORM EF中是否仍然存在此问题?
如果继续这样下去,下一次有人问为什么没有使用EF,我将有很多理由,而不仅仅是“LINQ to SQL完全正常”..