Entity Framework Core 3.1 入门(三)一对一、多对多

时间:2021-02-04 11:48:47   收藏:0   阅读:0

此入门教程是记录下方参考资料视频的过程,本例基于Entity Framework Core 3.1
开发工具:Visual Studio 2019

参考资料:https://www.bilibili.com/video/BV1xa4y1v7rR

一对一

  1. 添加一个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; }
}
  1. 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; }
}

多对多

  1. 添加一个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; }
}
  1. 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做联合主键(不推荐,主键标识还是需要的)

  1. 中间表不需要DbSet,别忘记DbContext配置联合主键,DbContext中override OnModelCreating方法
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
      //Entity<T>,T填中间表
      modelBuilder.Entity<GamePlayer>().HasKey(x => new { x.PlayerId, x.GameId });
}
  1. 完成操作后,生成迁移文件,同步数据库

创建数据库和迁移(Migration)文件结束

EF Core 5.0的多对多有机会就写一篇

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!