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