![](/img/trans.png)
[英]Entity Framework Core - combination between two many-to-many relationships
[英]Entity Framework Core 2.0 many-to-many relationships same table
我正在使用Entity Framework Core 2.0映射現有數據庫,該數據庫有兩個表格: Teams
和SupportTeam
。
團隊字段: 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
兩個 參考導航屬性(定義了TeamSupport
和Team
之間的兩個多對一關系),但是Team
實體只有一個 集合導航屬性,因此EF不知道如何將其映射到Team.Team
或Team.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.