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

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

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

1、属性特性

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

使用DataAnnotations需要在Nuget中安装System.ComponentModel.Annotations包

  • 添加好attribute后说明Name字段最大长度为100

  • 添加[Required]说明它是必填的

  • Birth是出生日期,只需要年月日,在数据库中却是DATETIME2(7) ,这里就需要设置数据库为日期类型

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

add-migration changePlayerColumb

生成成功后再执行

Update-Database

将数据库更新为指定的迁移
其他更多特性请参考:https://www.cnblogs.com/dotnetmvc/p/3734272.html支持的完整特性列表

2、表之间关系

以下三个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是子表。

3、多对多关系

在三个Model的基础上再建一个Model,叫比赛Game,就是每个队员一个赛季可能要参加很多比赛,而每个比赛也有很多队员同时去参加,所以说这个队员和比赛之间就应该是多对多的关系(M:N),我们使用CFCore是无法直接实现多对多的关系
可以加一个中间表叫GamePlayer,比如说一个队员他本赛季参加了五场比赛那么它就应该是对应的五个GamePlayer一对多的关系,它俩之间是一对多的关系1:M,每场比赛又有多个队员去参加,每个队员就相当于这场比赛的一个GamePlayer,所以说这个比赛和GamePlayer之间也是一对多的关系,这样队员和这个比赛之间就相当于间接地形成了一个这个多对多的关系。

创建一个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

4、一对一的关系

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

创建一个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项目

博客文章可以转载,但不可以声明为原创

(0)

相关推荐

  • 殷浩详解DDD:领域层设计规范

    在一个DDD架构设计中,领域层的设计合理性会直接影响整个架构的代码结构以及应用层.基础设施层的设计.但是领域层设计又是有挑战的任务,特别是在一个业务逻辑相对复杂应用中,每一个业务规则是应该放在Enti ...

  • C语言标准头的使用,C语言入门教程,你我的好帮手

    每个标准库函数都会被声明在一个或多个标准头(standard header)中.这些标准头也包括了 C 语言标准提供的所有宏和类型的定义. 每个标准头都包含一组相关的函数声明.宏和类型定义.例如,数学 ...

  • 沿用上百年的楷书入门教程,看过都说好!

    .................................................................................................... ...

  • 电路板维修入门教程

    (一)          电容篇 1.电容在电路中一般用"C"加数字表示(如C25表示编号为25的电容). 电容是由两片金属膜紧靠,中间用绝缘材料隔开而组成的元件.电容的特性主要是 ...

  • 国画入门教程:山石的画法

    山石是山水画最基本的内容,石是山的局部,山石的绘画,要经过勾.皴.擦.点.染等几个基本步骤或再增加提的程序. 今天我们就来讲讲几种皴的画法,帮助大家学习一下. 批麻皴 01 披麻皴,是山水画皴法之一, ...

  • 光功率计快速入门教程,光功率计使用方法图解

    光功率计快速入门教程 一.按键说明 1 . DET 删除数据键:   删除测量过的数据 2 . dBm /  W  REL 键:测量结果的单位转换,每按一次此键,显示方式在   " W &q ...

  • 笔法、笔势,练的是手上的功夫!(详细入门教程)

    笔法.笔势是蕴含在点画书写中的规律性技法,是真.草.隶.篆.行各体都用的着的技法,提炼出转.折.提.按.中锋.侧锋.入笔.行笔.收笔等关键的笔法.笔势,有意识的.逐个的加以强化日常训练.或集中练习.反 ...

  • 【组队学习】【25期】Web开发入门教程

    Web开发入门教程 开源内容: https://github.com/datawhalechina/whale-web 基本信息 贡献人员:张梁.王晓亮.何锋丽.张少波.谢文昕 学习周期:16天 学习 ...

  • Python爬虫入门教程(十四):爬取有声小说网站数据

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. Python爬虫.数据分析.网站开发等案例教程视频免费在线观看 https://space. ...

  • 奇门遁甲最全入门教程

    看本文需要了解天干地支和阴阳五行,奇门遁甲的学习必须掌握节气历法. 奇门遁甲之由来:约5000年前黄帝创始---360天/年*12时辰/天*1局/时辰=4320局/年风后简之---4320局/年/4= ...