通过关联表的实体框架1to1关系在EDMX中不起作用

时间:2015-02-17 16:47:07

标签: c# sql-server entity-framework entity-framework-6 edmx

我在SQL Server数据库中有以下表格 enter image description here

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

要清楚FooBar不允许任何FooId(由于唯一约束)多次出现在表中,任何BarId(由于唯一约束)都不会在表中多次出现。这就是使其成为1-1关联表的原因。

我希望在Foo和Bar之间建立这种关联表而不是1-1关系,因为在我的真实世界场景中,Bar将与其他不相关的表有其他关系,我会想要类似的关联表(而不是添加新的FK)每个新表的栏到栏

然后我将这些表格带入我的EDMX设计师。这种关系是以多对多而非一对一的方式引入的。 enter image description here

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

然后我得到一个错误(在设计师中)。 enter image description here

这是一个错误还是不可能在EF中以这种方式创建1-1关联?

2 个答案:

答案 0 :(得分:8)

这是一个" bug"整个EF设计:实体框架4-6.1x 仅尊重主键上的多重性

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

"解决方案"包括:

  1. 将模型更改为EF理解的内容(EF理解Code First,而不是RA)。当然,这可能表明一个问题"使用选定的RA模型,但这与问题正交。

  2. 使用错误生成的多重性规则生活,并且"谨慎使用&#34 ;;脏工作可以包装,但必须在自动生成的模型之外手动添加。

  3. ..嗯,其他人?

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

答案 1 :(得分:1)

就EF而言,您在第一张图片中显示的关系不是1to1关系。

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表是一个复合键,这意味着它是组成键的Foo和Bar值的组合 - 而不是1对1的关系

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

Foo
FooId PK

Bar
FooId PK FK to Foo.FooId

foo和bar之间的1to1关系不需要FooBar表。

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