[英]Creating a one to many with an association table in Entity Framework
我有一個名為SportTeams
的關聯表:
public class SportTeam
{
int SportId;
int TeamId;
Sport Sport;
Team Team
}
public class Sport
{
ICollection<SportTeam> SportTeams;
}
public class Team
{
ICollection<SportTeam> SportTeams;
}
我通過 fluent api 將此標記為關聯表
modelBuilder.Entity<SportTeam>().HasKey(q => new { q.SportId,q.TeamId }); // set the primary key of the table
modelBuilder.Entity<SportTeam>().HasRequired(s => s.Team).WithMany(t => t.SportTeams).HasForeignKey(s => s.TeamId);
modelBuilder.Entity<SportTeam>().HasRequired(s => s.Sport).WithMany(s => s.SportTeams).HasForeignKey(s => s.SportId);
現在我需要使用關聯表SportTeams
創建SportTeams
。 我們稱該表為Matches
。
public class Matches
{
int Id;
int SportTeamId;
SportTeam SportTeam;
}
public class SportTeam
{
int SportId ;
int TeamId;
Sport Sport;
Team Team;
ICollection<Match> Matches;
}
我回到 fluent api 對這個一對多進行更改。
我說
modelBuilder.Entity<SportTeam>().HasMany(st => st.Matches).WithRequired(matches => matches.SportTeam).HasForeignKey(m => m.SportTeamId).WillCascadeOnDelete(false);
我收到一個錯誤:
關系約束中的從屬角色和主要角色中的屬性數量必須相同。
我相信這個錯誤表明我的運動隊 PK 是一個復合鍵,在我的 HasForeignKey 部分我只指定了一個 FK 來連接。
我該如何處理這種情況?
您錯誤地配置了SportTeam
和Matches
之間的SportTeam
。 所以你說SportTeam
實體可以有很多Matches
然后它邏輯Matches
實體有一個引用SportTeam
實體的外鍵。
但是,如果您查看您的SportTeam
實體配置,您會說它有一個復合鍵作為主鍵( SportId
、 TeamId
)。
您收到此錯誤:
關系約束中的從屬角色和主要角色中的屬性數量必須相同。
因為如果您將復合鍵作為主鍵,那么引用SportTeam
主鍵的外鍵也應該具有復合鍵中隱含的兩個屬性。
因此,要解決此問題,您的Matches
實體應如下所示:
public class Matches
{
public int Id { get; set; }
// these two properties below represent the foreign key that refers to SportTeam entity.
public int SportId { get; set; }
public int TeamId { get; set; }
public SportTeam SportTeam { get; set; };
}
在OnModelCreating
方法中,您應該有這一行:
modelBuilder.Entity<SportTeam>()
.HasMany(st => st.Matches)
.WithRequired(matches => matches.SportTeam)
.HasForeignKey(m => new { m.SportId, m.TeamId }) // <-- the composite foreign keys.
.WillCascadeOnDelete(false);
代替:
modelBuilder.Entity<SportTeam>()
.HasMany(st => st.Matches)
.WithRequired(matches => matches.SportTeam)
.HasForeignKey(m => m.SportTeamId)
.WillCascadeOnDelete(false);
我總是避免使用復合外鍵。 如果我在您的示例中得到了類似的結果,我只是在SportTeam
實體中放置了一個主鍵屬性Id
,並在數據庫中使用唯一的約束創建了兩個屬性SportId
和TeamId
。
我不知道您是否在實際項目中這樣編碼,但請使用屬性並在必要時將它們公開。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.