[英]Entity Framework relationship with two foreign keys
我在FluentAPI中连接两个表时遇到问题。 实际上,它是FluentAPI和数据注释的混合。 我看着这个问题,但没有帮助我。 我尝试使用Index
,它由唯一键组成。
基本上, Foo
是主表。 Bar
桌是可选的。 通过两列连接。 key1
和key2
对是唯一的。 将其视为父子关系,但有一个限制,即1个父母只能生育1个孩子:
数据实体看起来像这样:
[Table("foo")]
public class Foo
{
[Key]
[Column("pk", TypeName = "int")]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int FooId { get; set; }
[Column("key1", TypeName = "int")]
public int Key1 { get; set; }
[Column("key2", TypeName = "int")]
public int Key2 { get; set; }
public Bar Bar { get; set; }
}
[Table("bar")]
public class Bar
{
[Key]
[Column("key1", TypeName = "int", Order = 1)]
public int Key1 { get; set; }
[Key]
[Column("key2", TypeName = "int", Order = 2)]
public int Key2 { get; set; }
public Foo Foo { get; set; }
}
这是我尝试连接它们的方式:
modelBuilder.Entity<Bar>().HasRequired(p => p.Foo).WithOptional(p => p.Bar);
怎么了? Bar
确实需要Foo
。 Foo
有可选的Bar
。 <---这应该足够了,因为Foo
在Bar
具有与主键完全相同的命名方式。 但这是行不通的。
所以我尝试指定外键:
modelBuilder.Entity<Bar>().HasRequired(p => p.Foo).WithOptional(p => p.Bar).Map(p => p.MapKey(new[] { "key1", "key2" }));
它说:
“指定的列数必须与主键列数匹配”
哇啊 怎么样? 怎么会? 嗯..
我也尝试过:
modelBuilder.Entity<Bar>().HasIndex(table => new { table.Key1, table.Key2 });
所以我的问题是:
为什么我的解决方案不起作用? 我确实指定了复杂的密钥
我该怎么打呢?
这将有点复杂,在这里我可能完全错了,但是从我的经验来看,EntityFramework关系并不是那样。 在我看来,如果Foo是必需的,而Bar是可选的 ,则每个Bar应该有一种基于Foo的pk值唯一地返回到Foo的方法。
也就是说,Bar应该定义为:
[Table("bar")]
public class Bar
{
[Key]
[Column("key1", TypeName = "int", Order = 1)]
public int Key1 { get; set; }
[Key]
[Column("key2", TypeName = "int", Order = 2)]
public int Key2 { get; set; }
public int FooId { get; set; }
public Foo Foo { get; set; }
}
然后,您需要在关系描述中使用此FooId,而不是Bar中包含的组合键。 EntityFramework一直要求我加入父POCO的整个主键,该主键必须是子POCO的外键。 您可能仍然可以通过子键在LINQ查询中加入。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.