1. 程式人生 > 實用技巧 >EntityFramework Core入門教程-02-建立關係表

EntityFramework Core入門教程-02-建立關係表

原文:https://blog.csdn.net/weixin_40719943/article/details/106956224

一、一對多關係

以下三個類:
1 在Club中添加了League的導航屬性,但是League中並沒有新增對Club的引用,說明允許多個Club中新增同一個League的導航屬性,League:Club=1:n
2 在Club中添加了Player集合的導航屬性,說明一個Club中可以引用多個Player,但是Player中沒有新增對Club的引用,說明Club:Player=1:n
3 在類中沒有建立體現一對多關係的外來鍵屬性,update-database的時候,EFCore會自動建立外來鍵


外來鍵在多的一方建立:
League:Club=1:n Club中有League的外來鍵
Club:Player=1:n Player中有Club的外來鍵

    public class Club
    {
        public Club()
        {
            Players = new List<Player>();
        }
        public int Id { get; set; }
        public string Name { get; set; }
        public
string City { get; set; } public DateTime DateOfEstablishment { get; set; } public string History { get; set; } public League League { get; set; }//導航屬性 public List<Player> Players { get; set; }//導航屬性 } public class League { public int
Id { get; set; } public string Name { get; set; } public string Country { get; set; } } public class Player { public int Id { get; set; } public string Name { get; set; } public DateTime DateOfBirth { get; set; } }

二、一多一關係

1 建立Resume類,使Resume和Player是一多一的關係,在兩個類中分別新增對方的導航屬性和外來鍵

    public class Resume
    {
        public int Id { get; set; }
        public string Description { get; set; }

        public int PlayerId { get; set; }
        public Player Player { get; set; }
    }
    public class Player
    {
		....
        public int ResumeId { get; set; }
        public Resume Resume { get; set; }
    }

2 這兩個類是一對一關係,EFCore會選擇其中一個作為主體,但EFCore有時候會選錯,為了保險起見,我們需要在DbContext中用Fluent API來指定這兩張表的一對一關係.
在ContextDemo這個類中重寫DBContext中的方法:

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    //指定一對一關係
    modelBuilder.Entity<Resume>()
        .HasOne(x => x.Player)
        .WithOne(x => x.Resume)
        .HasForeignKey<Resume>(x => x.PlayerId);
}

三、多對多關係

1 新增一個Game表,一個比賽可以包含多個隊員player,一個player也可能參加多場game,因此
Game和Player是多對多的關係;
2 EFCore配置多對多的關係,需要一箇中間表,我麼起名叫GamePlayer

GamePlayer中間表起到連線作用,可以理解成是一個對映表,一個Game可能會有多條GamePlayer記錄,一個Player也可能有多條Game記錄
Game:GamePlayer=1:n 關係
Playe:GamePlayerr=1:n 關係

3 新建Game類,GamePlayer類,修改Player類
由於Game和GamePlayer 以及Player和GamePlayer都是一對多關係
分別在Game類及Player類對GamePlayer新增集合導航屬性;
在GamePlater中建立兩張表的外來鍵以及導航屬性

public class GamePlayer
{
    public int PlayerId { get; set; }
    public int GameId { get; set; }

    public Game Game { get; set; }
    public Player Player { get; set; }
}
public class Game
{
    public Game()
    {
        GamePlayers = new List<GamePlayer>();
    }
	public List<GamePlayer> GamePlayers { get; set; }
	
    public int Id { get; set; }
    public int Round { get; set; }
    public DateTime? StartTime { get; set; }
}
public class Player
{
    public Player()
    {
        //初始化,避免出現空指標異常
        GamePlayers = new List<GamePlayer>();
    }
    public List<GamePlayer> GamePlayers { get; set; }
    
	...//其他欄位
}

4 多對多關係表GamePlayer沒有設定主鍵,這張表只有兩個欄位,是另外兩張表的主鍵,因此GamePlayer可以使用聯合主鍵,在dbcontext中配置聯合主鍵

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    //為GamePlayer設定聯合主鍵
    modelBuilder.Entity<GamePlayer>().HasKey(x => new { x.PlayerId, x.GameId });
    
	//....  
}

執行add-migration migName—update-database—生效

結束語:以上就是對一對一、一對多、多對多關係表的簡單配置,不是特別全面,僅供入門參考,詳細深入瞭解請閱讀官方文件。