Entity Framework 通过关联的 1to1 关系 table 在 EDMX 中不起作用

Entity Framework 1to1 relationship via association table not working in EDMX

我在 SQL 服务器数据库中有以下 tables

其中有一个1-1关联table(FooBar)在对应的FooId,BarId上有唯一索引,主键是(FooId,BarId)。

需要明确的是,FooBar 不允许任何 FooId(由于唯一约束)多次出现在 table 中,任何 BarId(由于唯一约束)也不能出现在 table 中不止一次。这就是使它成为 1-1 关联 table.

的原因

我想要这种关联 table 而不是 Foo 和 Bar 之间的 1-1 关系,因为在我的现实世界场景中,Bar 将与不同的不相关 table 有其他关系,我会想要类似的关联 tables(而不是为每个新的 table 添加新的 FK 列到 Bar)

然后我将这些 table 带入我的 EDMX 设计器。这种关系是以多对多而不是一对一的形式引入的。

这当然不是我想要的。我可以手动将模型更改为 1-1 关系。

但后来我得到一个错误(在设计器中)。

这是错误还是无法在 EF 中以这种方式创建 1-1 关联?

就 EF 而言,您在第一个图形中显示的关系不是一对一的关系。

FooBar

之间是多对多的关系

这样想:

具有以下 FooBar 值的可能组合

Foo
1
2
3

Bar
1
2
3

FooBar
1, 1
1, 2
1, 3
2, 1
2, 2
2, 3
3, 1
3, 2
3, 3

您的 FooBar table 是复合键,这意味着它是构成键的 Foo 和 Bar 值的组合 - 不是一对一的关系

要定义 Foo 和 Bar 之间的一对一关系,您的架构应该看起来更像这样:

Foo
FooId PK

Bar
FooId PK FK to Foo.FooId

foo 和 bar 之间的一对一关系不需要 FooBar table。

正如您在 question/comments 中所述 - 是的,您对复合键的各个部分设置了唯一约束,但 EF 在确定关系时不会考虑模型的唯一约束。如果你想要一对一的关系,你应该创建一个一对一的模型,而不是通过唯一的约束来模拟一对一的关系。

它是一个 "bug" 的整个 EF 设计:Entity Framework 4-6.1x 仅支持主键的多重性

因此,即使我们知道(和 RA 模型)由于候选键约束,它是一对一的关系, EF 不喜欢也不会喜欢它。运气不好。

"solutions"包括:

  1. 将模型更改为 EF 可以理解的模型(EF 理解代码优先,而不是 RA)。当然,这可能表明 "issue" 与所选的 RA 模型,但这与问题正交..

  2. 忍受错误生成的多重规则和"use with care";脏工作可以被包装,但必须在自动生成的模型之外手动添加。

  3. ..嗯,其他人呢?

对未解决问题的无耻插件处理相同的核心缺失功能:

  • How to get EF6 to honor Unique Constraint (on FK) in Association/Relationship multiplicity?

  • How to add an EF6 Association to a Candidate Key / Unique Key which is not the Primary Key?