首頁 >後端開發 >C++ >如何首先在實體框架代碼中處理多個外國鍵?

如何首先在實體框架代碼中處理多個外國鍵?

DDD
DDD原創
2025-01-29 07:55:09540瀏覽

How to Handle Multiple Foreign Keys to the Same Table in Entity Framework Code First?

Entity Framework Code First:處理指向同一表的多個外鍵

在 Entity Framework Core 中,對實體間關係進行建模至關重要。正如您遇到的那樣,創建具有指向同一表多個外鍵的模型可能會導致異常。

在您的示例中,您定義了 Team 和 Match 實體,目的是捕獲團隊和比賽之間的關係,其中一場比賽涉及兩支球隊,一支主隊和一支客隊。但是,您的初始方法會觸發循環引用異常。

為了解決此問題,必須利用 HasRequired() 和 WithMany() 方法以及 OnModelCreating() 中的流暢 API 配置。這是一個更新後的模型:

<code class="language-c#">public class Team
{
    public int TeamId { get; set; }
    public string Name { get; set; }

    public virtual ICollection<Match> HomeMatches { get; set; }
    public virtual ICollection<Match> AwayMatches { get; set; }
}

public class Match
{
    public int MatchId { get; set; }
    public int HomeTeamId { get; set; }
    public int GuestTeamId { get; set; }

    public float HomePoints { get; set; }
    public float GuestPoints { get; set; }
    public DateTime Date { get; set; }

    public virtual Team HomeTeam { get; set; }
    public virtual Team GuestTeam { get; set; }
}

public class Context : DbContext
{
    // ...

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Match>()
                    .HasOne(m => m.HomeTeam)
                    .WithMany(t => t.HomeMatches)
                    .HasForeignKey(m => m.HomeTeamId)
                    .OnDelete(DeleteBehavior.Restrict); // or DeleteBehavior.NoAction

        modelBuilder.Entity<Match>()
                    .HasOne(m => m.GuestTeam)
                    .WithMany(t => t.AwayMatches)
                    .HasForeignKey(m => m.GuestTeamId)
                    .OnDelete(DeleteBehavior.Restrict); // or DeleteBehavior.NoAction
    }
}</code>

在此模型中:

  • Team 實體包含兩個比賽集合:HomeMatches 和 AwayMatches。
  • Match 實體具有 HomeTeamId 和 GuestTeamId。
  • 在 OnModelCreating() 中,我們使用 Fluent API 配置關係。這可以防止循環引用。
  • 我們顯式設置 OnDelete(DeleteBehavior.Restrict) (或 DeleteBehavior.NoAction) 以防止由於自引用多對多關係導致的級聯刪除。

通過這種方法,您可以成功地在 EF Core 模型中建立指向同一表的多個外鍵。 注意,WillCascadeOnDelete(false) 在較新的 EF Core 版本中已被棄用,建議使用 OnDelete(DeleteBehavior.Restrict)OnDelete(DeleteBehavior.NoAction)Restrict 會阻止刪除操作,除非相關記錄不存在;NoAction 會忽略刪除操作,這取決於數據庫提供程序的行為。 選擇哪個取決於您的具體需求。

以上是如何首先在實體框架代碼中處理多個外國鍵?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn