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

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

DDD
發布: 2025-01-29 07:55:09
原創
521 人瀏覽過

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 配置。這是一個更新後的模型:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

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

    }

}

登入後複製

在此模型中:

  • 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
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板