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

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

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

目录

Entity Framework Core 3.1 入门(一)创建项目

Entity Framework Core 3.1 入门(二)创建数据库和迁移(Migration)文件

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

Entity Framework Core 3.1 入门(四)增删改查

Entity Framework Core 3.1 入门(五)关联数据的添加和查询

Entity Framework Core 3.1 入门(六)一对一和多对多关系的增删改查

Entity Framework Core 3.1 入门(七)执行原生SQL语句

Entity Framework Core 3.1 入门(八)在 ASP.NET Core 中配置 Entity Framework Core

一对一

  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. 完成操作后,生成迁移文件,同步数据库

一对一、多对多 结束

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

posted @ 2021-02-03 14:36  .NET好耶  阅读(1264)  评论(1编辑  收藏  举报