三、Entity Framework Core 3.1入门教程-设定字段属性

本文章是根据 微软MVP solenovex(杨旭)老师的视频教程编写而来,再加上本身的一些理解。
视频教程地址:https://www.bilibili.com/video/BV1xa4y1v7rR
GitHub源码:https://github.com/hllive/LearnEFCore3.1html

Model之间的【多对多】【一对多】【 一对一】的关系怎么设定,或者说数据表之间的【多对多】【一对多】【 一对一】的关系怎么设定;git

一、属性特性

咱们先讲一下这些字段或者叫属性,它们的属性怎么设定,好比说这个name这个属性,它在数据库中的字段类型是NVARCHAR(MAX),而实际上它的长度应该有必定限制,好比要求长度不超过100,那可使用DataAnnotations的attribute[Maxlength(100)]github

使用DataAnnotations须要在Nuget中安装System.ComponentModel.Annotations包数据库

  • 添加好attribute后说明Name字段最大长度为100
  • 添加[Required]说明它是必填的
  • Birth是出生日期,只须要年月日,在数据库中倒是DATETIME2(7) ,这里就须要设置数据库为日期类型


再执行迁移命令生成新的迁移文件mvc

add-migration changePlayerColumb

生成成功后再执行ide

Update-Database

将数据库更新为指定的迁移
其余更多特性请参考:http://www.javashuo.com/article/p-gbpwtksc-nc.html支持的完整特性列表ui

二、表之间关系

如下三个Model都是一对多的关系

Club能够看到有一个导航属性League,导航到一个单个的League上面,因此说每一个Club都对应一个League,而这个每一个Club对应的League他有多是同一个,因此说一个League就可能对应多个Club,这样就体现了一对多的关系,只在Club一个类里体现就能够了
既然有了这种一对多的关系,那么在子表也就是Club表里或者是Club的Model里边儿应该有一个字段是叫外键,实际上在类Club中没有,在数据库Club外键中是有LeagueId。在C#类中没有写LeagueId,EFCore会生成一个LeagueId外键,咱们也能够在类中手动写出来一个属性,手动指定,也能够不写,不写的话EFCore会自动生成一个
Club和Player之间的一对多关系是怎么体现的呢,Club里的最后一个属性也是这种导航属性不过是另一种形式的导航属性,上面的League至关因而对单个的League,而对这个Player导航属性的类型是一个集合,因此说呢?这至关于另一个方向了,这个时候club是主表,而后Player是子表。
3d

三、多对多关系

在三个Model的基础上再建一个Model,叫比赛Game,就是每一个队员一个赛季可能要参加不少比赛,而每一个比赛也有不少队员同时去参加,因此说这个队员和比赛之间就应该是多对多的关系(M:N),咱们使用CFCore是没法直接实现多对多的关系
能够加一个中间表叫GamePlayer,好比说一个队员他本赛季参加了五场比赛那么它就应该是对应的五个GamePlayer一对多的关系,它俩之间是一对多的关系1:M,每场比赛又有多个队员去参加,每一个队员就至关于这场比赛的一个GamePlayer,因此说这个比赛和GamePlayer之间也是一对多的关系,这样队员和这个比赛之间就至关于间接地造成了一个这个多对多的关系。
code

建立一个Game类和GamePlayer类

public class Game
{
    public Game()
    {
        GamePalyers = new List<GamePlayer>();
    }
    public Guid Id { get; set; }
    public int Round { get; set; }//比赛阶段
    public DateTimeOffset? StartTime { get; set; }//开始时间
    public List<GamePlayer> GamePalyers { get; set; }
}
public class GamePlayer
{
    public Guid PlayerId { get; set; }
    public Guid GameId { get; set; }
    //这里也能够体现一对多的关系
    public Game Game { get; set; }
    public Player Player { get; set; }
}

在Player中添加一对多的关系


最后设定联合主键,必须手动设定,在DbContext中设定,能够override OnModelCreating()

设定好后执行迁移命令视频

Add-Migration AddMage

执行更新数据库

Update-Database

四、一对一的关系

假设每一个队员只能有一份简历,而后这一份简历呢,就属于这一个队员,因此这就属于一对一的关系

建立一个Resume类

//简历
public class Resume
{
    public Guid Id { get; set; }
    [MaxLength(200)]
    public string Description { get; set; }
    public Guid PlayerId { get; set; }//Player外键
    public Player Player { get; set; }//Player导航属性
}

在Player类中添加简历属性,这样就能实现Resume和Player类的一对一关系

这时候EFCore会选择其中一个类做为主表,可是EFCore可能会选错,因此仍是须要手动指定主外键
在DbContext中的OnModelCreating()方法中添加

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    //设置联合主键
    modelBuilder.Entity<GamePlayer>().HasKey(x => new { x.PlayerId, x.GameId });
    modelBuilder.Entity<Resume>()
        .HasOne(x => x.Player)//一个Resume拥有一个Player
        .WithOne(x => x.Resume)//每一个Player又带了一个Resume
        .HasForeignKey<Resume>(x => x.PlayerId);//Resume上又带了一个外键PlayerId
}

设定好后执行迁移命令<

Add-Migration AddResumeToOnePlayer

执行更新数据库

Update-Database

若是执行遇到如下错误:请注意默认项目须要选择Data项目

博客文章能够转载,但不能够声明为原创

相关文章
相关标签/搜索