簡體   English   中英

具有兩個外鍵的實體框架關系

[英]Entity Framework relationship with two foreign keys

我在FluentAPI中連接兩個表時遇到問題。 實際上,它是FluentAPI和數據注釋的混合。 我看着這個問題,但沒有幫助我。 我嘗試使用Index ,它由唯一鍵組成。

基本上, Foo是主表。 Bar桌是可選的。 通過兩列連接。 key1key2對是唯一的。 將其視為父子關系,但有一個限制,即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 <---這應該足夠了,因為FooBar具有與主鍵完全相同的命名方式。 但這是行不通的。

所以我嘗試指定外鍵:

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 });  

所以我的問題是:

  1. 為什么我的解決方案不起作用? 我確實指定了復雜的密鑰

  2. 我該怎么打呢?

這將有點復雜,在這里我可能完全錯了,但是從我的經驗來看,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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM