Entity Framework Core 3.1 入门(三)一对一、多对多
此入门教程是记录下方参考资料视频的过程,本例基于Entity Framework Core 3.1
开发工具:Visual Studio 2019
目录
Entity Framework Core 3.1 入门(八)在 ASP.NET Core 中配置 Entity Framework Core
一对一
- 添加一个Resume(简历)表:一个Player对应一个Resume
public class Resume
{
public int Id { get; set; }
public string Description { get; set; }
//外键
public int PlayerId { get; set; }
//导航属性,可以不写,但是建议写一对
public Player Player { get; set; }
}
- EF Core会选一个表作为主体,但是有时不准,所以我们要手动设置主体,在 DbContext 的 override OnModelCreating 方法中
//先添加 DbSet
public DbSet<Resume> Resumes { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
//Entity<T>,T填谁都可以
//HasForeignKey<T>,T一定要是外键在的表
modelBuilder.Entity<Resume>().HasOne(x => x.Player)
.WithOne(x => x.Resume)
.HasForeignKey<Resume>(x => x.PlayerId);
}
一对多
只需要在一个类中体现就可以了,比如:一个League对应多个Club,Club中的League属性就能体现一对多
或者使用List<>集合,比如,一个Club对应多个Player,Club中的List
Entity Framework Core会自动生成外键
public class League
{
public int Id { get; set; }
public string Name { get; set; }
public string Country { get; set; }
}
public class Club
{
public Club()
{
//实例化列表,防止空指针异常
this.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 Player
{
public int Id { get; set; }
public string Name { get; set; }
public DateTime DateOfBirth { get; set; }
}
多对多
- 添加一个Game(比赛)表,一个Game可以对应多个Player,一个Player也可以对应多个Game
public class Game
{
public Game()
{
this.GamePlayers = new List<GamePlayer>();
}
public int Id { get; set; }
//回合数
public int Round { get; set; }
public DateTimeOffset? StartTime { get; set; }
//多对多中间表
public List<GamePlayer> GamePlayers { get; set; }
}
- EF Core 3.0不能直接体现多对多(5.0支持多对多,看官方文档),需要一个中间表GamePlayer表,一个Player对应多个GamePlayer,一个Game对应多个GamePlayer
方案一:
Game:添加List,或者GamePlayer中添加Game属性
Player:添加List,或者GamePlayer中添加Player属性
方案二:
GamePlayer:添加GameId和PlayerId外键
这里我使用方案二
public class GamePlayer
{
public int PlayerId { get; set; }
public Player Player { get; set; }
public int GameId { get; set; }
public Game Game { get; set; }
}
注意:这是多对多的中间表,主键无所谓,使用GameId和PlayerId做联合主键(不推荐,主键标识还是需要的)
- 中间表不需要DbSet,别忘记DbContext配置联合主键,DbContext中override OnModelCreating方法
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
//Entity<T>,T填中间表
modelBuilder.Entity<GamePlayer>().HasKey(x => new { x.PlayerId, x.GameId });
}
- 完成操作后,生成迁移文件,同步数据库
一对一、多对多 结束
EF Core 5.0的多对多有机会就写一篇