【问题标题】:How to get EF6 to honor Unique Constraint (on FK) in Association/Relationship multiplicity?如何让 EF6 在关联/关系多重性中遵守唯一约束(在 FK 上)?
【发布时间】:2014-12-22 19:14:56
【问题描述】:

2019 年更新/TLDR;切换到实体框架Core(或其他)

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

添加的这种支持在(非常过时的)EF Core 1.0 release.. 有点令人失望,原来的 EF 从未解决这个设计(编辑!)缺陷。


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

  1. Entity Framework 是一个糟糕的关系代数映射器1 或者;

  2. (我希望如此)我忽略了 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 &lt;-&gt; 0..1:Melds2的多重性。

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 &lt;-&gt; M:Meld

当我尝试手动将 Meld(通过设计器中的“关联集”属性)一侧的多重性更改为 10..1 时,我得到:

运行转换:多重性在关系“FK_Melds_ExternalMaps”中的角色“Meld”中无效。因为依赖角色属性不是关键属性,所以依赖角色的多重性的上限必须是*

(与我的其他问题一样,这似乎与唯一约束被正确注册/授予候选键有关。)

我怎样才能让 EF 遵守模型建立的 1 &lt;-&gt; 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“Microsoft 认可的企业就绪”ORM 的情况吗?

按照这个速度,下次有人问为什么不使用 EF 时,除了“LINQ to SQL 工作正常”之外,我还有一大堆理由......

【问题讨论】:

  • 当您删除唯一性约束时...它是否会为您生成正确的数据库/模型?
  • @YoupTube 它似乎生成了相同的模型 - 只是这次模型实际上是正确的 wrt。由于缺少数据库中的 UX 而导致的架构(但随后它违反了 RI 数据规则)。我通过更改列名来确保我正在编辑正确的数据库,这确实是正确的。
  • 而且,虽然这是一种弱方法,但之后手动添加用户体验???
  • EF 不支持,也从未支持过。 EF 在共享主键上仅支持 1:1 或 1:0..1。一直在谈论修复这个问题,它实际上可能在 EF7 中得到修复,但目前它不受支持(关于这个问题,这里有很多问题)。 L2S 也不支持这一点,尽管它似乎对您有用。它不能保证工作,所以有一天你可能会发现你的代码无缘无故被 L2S 破坏了。如果您正在进行新的 EF 开发,也不应该使用 EDMX,因为 EDMX 文件将在 EF7 中消失。
  • @ErikFunkenbusch 感谢您提供这些信息。我希望 ES6 文档/表扬指南对此更清楚。在 EF7 中,什么将取代 EDMX 以实现 Schema-first?无论如何,L2S 确实 似乎支持这种情况 - 至少在 codeplex 上的 TT 插件。 (相反,我从来没有“不工作”。)

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


【解决方案1】:

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

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

.. Entity Framework 目前仅支持基于主键的引用约束,没有唯一约束的概念

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


如果 EF 的这种严重限制被公开讨论并“众所周知”,我会很高兴,尤其是当 EF 被吹捧为支持 Schema First 和/或取代 L2S 时。从我的角度来看,EF 的中心是仅将 Code First 映射(和支持)作为一等公民。也许再过 4 年..

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-07
    • 1970-01-01
    • 2018-06-29
    • 2012-11-24
    • 2021-02-03
    • 1970-01-01
    • 2017-09-15
    相关资源
    最近更新 更多