簡體   English   中英

在實體框架中使用關聯表創建一對多

[英]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 來連接。

我該如何處理這種情況?

您錯誤地配置了SportTeamMatches之間的SportTeam 所以你說SportTeam實體可以有很多Matches然后它邏輯Matches實體有一個引用SportTeam實體的外鍵。

但是,如果您查看您的SportTeam實體配置,您會說它有一個復合鍵作為主鍵( SportIdTeamId )。

您收到此錯誤:

關系約束中的從屬角色和主要角色中的屬性數量必須相同。

因為如果您將復合鍵作為主鍵,那么引用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);

旁注1:

我總是避免使用復合外鍵。 如果我在您的示例中得到了類似的結果,我只是在SportTeam實體中放置了一個主鍵屬性Id ,並在數據庫中使用唯一的約束創建了兩個屬性SportIdTeamId

旁注2:

我不知道您是否在實際項目中這樣編碼,但請使用屬性並在必要時將它們公開。

暫無
暫無

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

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