[英]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.