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

时间:2014-12-22 19:14:56

标签: entity-framework entity-framework-6 foreign-keys unique-key multiplicity

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

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

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


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

  1. 实体框架是一个可怕的关系代数映射器 1 或;

  2. (我希望)我通常会忽略SSDL / CSDL和EDMX模型或EF映射。

  3. 我有一个 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(通过设计师中的“关联集”属性)手动更改多重性时,10..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工作得很好”之外还有很多原因。

1 个答案:

答案 0 :(得分:18)

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

This answer我的相关问题提供了a request to add the missing functionality的链接并总结了它:

  

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

这可以扩展到处理独特约束和候选键的所有领域,包括在这个问题中提出的多重性问题。


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