簡體   English   中英

實體框架核心2.0多對多關系相同的表

[英]Entity Framework Core 2.0 many-to-many relationships same table

我正在使用Entity Framework Core 2.0映射現有數據庫,該數據庫有兩個表格: TeamsSupportTeam

團隊字段: ID,姓名

TeamSupport :TeamID(團隊表上的外鍵),SupportTeamID(團隊表上的外鍵)

我試圖將它們映射如下:

 public class Team
 {
     public int Id { get; set; }
     public string name { get; set; }

     public List<TeamSupport> SupportTeams { get; set; }

 }

 public class TeamSupport
 {
     public int TeamId { get; set; }
     public virtual Team Team { get; set; }

     public int SupportTeamId { get; set; } // In lack of better name.
     public virtual Team SupportTeam { get; set; }
 }

但是當我運行“ add-migration”時出現以下錯誤:

無法確定由“列表”類型的導航屬性“ Team.SupportTeams”表示的關系。 手動配置關系,或者使用“ [NotMapped]”屬性或通過“ OnModelCreating”中的“ EntityTypeBuilder.Ignore”忽略此屬性。

TeamSupport實體具有對Team 兩個 參考導航屬性(定義了TeamSupportTeam之間的兩個多對一關系),但是Team實體只有一個 集合導航屬性,因此EF不知道如何將其映射到Team.TeamTeam.SupportTeam ),並拋出有問題的異常。

在這種情況下,您必須顯式解析映射。 通常,使用[InverseProperty]數據注釋就足夠了,但是對同一個表的多次引用總是會導致多個級聯路徑問題,這需要關閉一個或多個關系的刪除級聯。 而且后者只能通過流暢的配置完成,因此最好也使用流暢的配置進行整個映射。

您的模型現在所需的最低配置是:

modelBuilder.Entity<TeamSupport>()
    .HasOne(e => e.Team)
    .WithMany(e => e.SupportTeams);

modelBuilder.Entity<TeamSupport>()
    .HasOne(e => e.SupportTeam)
    .WithMany()
    .OnDelete(DeleteBehavior.Restrict);

請注意,由於沒有對應的集合導航屬性,因此第二個關系配置使用無參數WithMany重載來表明這一點。 如果您決定將此類集合添加到模型中

public class Team
{
    public int Id { get; set; }
    public string name { get; set; }

    public List<TeamSupport> SupportTeams { get; set; }
    public List<TeamSupport> SupportOfTeams { get; set; } // <--
}

不要忘記在相應的映射中指定

.WithMany(e => e.SupportOfTeams)

否則,EF將創建第三個關系。

有關更多信息,請參閱EF Core文檔的Relationhips部分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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