C# 实体框架1通过关联表建立的1对1关系在EDMX中不起作用
我在SQL Server数据库中有以下表格 它有一个1-1关联表(FooBar),在对应的FooId,BarId上有唯一的索引,主键是(FooId,BarId) 需要明确的是,FooBar不允许任何FooId(由于唯一约束)在表中出现多次,也不允许任何BarId(由于唯一约束)在表中出现多次。这就是它成为1-1关联表的原因 我想要这个关联表,而不是Foo和Bar之间的1-1关系,因为在我的现实世界场景中,Bar与不同的不相关表之间有其他关系,我想要类似的关联表(而不是为每个新表向Bar添加新的FK列) 然后我将这些表放入我的EDMX设计器中。这种关系是多对多而不是一对一的。 这当然不是我想要的。我可以手动将模型更改为1-1关系。 但是我(在设计器中)得到了一个错误。C# 实体框架1通过关联表建立的1对1关系在EDMX中不起作用,c#,sql-server,entity-framework,entity-framework-6,edmx,C#,Sql Server,Entity Framework,Entity Framework 6,Edmx,我在SQL Server数据库中有以下表格 它有一个1-1关联表(FooBar),在对应的FooId,BarId上有唯一的索引,主键是(FooId,BarId) 需要明确的是,FooBar不允许任何FooId(由于唯一约束)在表中出现多次,也不允许任何BarId(由于唯一约束)在表中出现多次。这就是它成为1-1关联表的原因 我想要这个关联表,而不是Foo和Bar之间的1-1关系,因为在我的现实世界场景中,Bar与不同的不相关表之间有其他关系,我想要类似的关联表(而不是为每个新表向Bar添加新的
这是一个错误还是不可能在EF中以这种方式创建1-1关联?就EF而言,您在第一张图中显示的关系不是1对1关系
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之间的1对1关系不需要FooBar表
正如您在问题/评论中所述-是的,您在复合键的各个部分上设置了唯一约束,但EF在确定关系时不考虑模型的唯一约束。如果您想要一对一关系,您应该创建一个一对一模型,而不是通过唯一的约束模拟一对一关系。这是整个EF设计的一个“缺陷”:实体框架4-6.1x只尊重主键上的多重性
因此,即使我们知道(和RA模型)由于候选密钥约束,它是1-1关系,EF也不会也不会喜欢它。真倒霉
“解决方案”包括:
条
?或者FooBar
?我不确定EntityFramework是否会考虑到您的独特约束。为什么不能在实际的1to1关系中建模表,而不是通过唯一约束模拟1to1?我在问题中解释了这一点。我不想在添加新关系时向栏中添加列。我希望它与其他关系无关,因此使用关联表。我没有否决它。我讨厌投否决票。不要认为这是建设性的;-)有没有办法覆盖DbContext.OnModelCreating,通过代码强制关系绕过这个问题?@Jim我情不自禁:在对某个问题产生了许多不愉快的想法之后,我选择了选项#2。。但是我不认为Model/Schema是这样的,因为错误来自设计时生成器本身。(除非谈论完全从*DL中删除它,也许…)我曾经考虑过这样做,删除设计器中的关系并通过代码添加。以前从未尝试过类似的方法,混合模型。但我以前就知道我会像这样破解周围的bug:-)可能会给它一次机会。