我在SQL Server数据库中有以下表格
其中有一个1-1关联表(FooBar),它在相应的FooId,BarId上有唯一索引,主键是(FooId,BarId)。
要清楚FooBar不允许任何FooId(由于唯一约束)多次出现在表中,任何BarId(由于唯一约束)都不会在表中多次出现。这就是使其成为1-1关联表的原因。
我希望在Foo和Bar之间建立这种关联表而不是1-1关系,因为在我的真实世界场景中,Bar将与其他不相关的表有其他关系,我会想要类似的关联表(而不是添加新的FK)每个新表的栏到栏
然后我将这些表格带入我的EDMX设计师。这种关系是以多对多而非一对一的方式引入的。
这当然不是我想要的。我可以手动将模型更改为1-1关系。
然后我得到一个错误(在设计师中)。
这是一个错误还是不可能在EF中以这种方式创建1-1关联?
答案 0 :(得分:8)
这是一个" bug"整个EF设计:实体框架4-6.1x 仅尊重主键上的多重性。
因此,即使我们知道(和RA模型)由于候选键约束而是1-1关系,但EF不会也不会喜欢它。好运。
"解决方案"包括:
将模型更改为EF理解的内容(EF理解Code First,而不是RA)。当然,这可能表明一个问题"使用选定的RA模型,但这与问题正交。
使用错误生成的多重性规则生活,并且"谨慎使用&#34 ;;脏工作可以包装,但必须在自动生成的模型之外手动添加。
..嗯,其他人?
对未解决的问题的无耻插件处理相同的核心缺乏功能:
答案 1 :(得分:1)
就EF而言,您在第一张图片中显示的关系不是1to1关系。
Foo
和Bar
以这种方式思考:
与以下Foo
和Bar
值
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关系。