本文章是根据 微软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项目

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

3、Entity Framework Core 3.1入门教程-设定字段属性的更多相关文章

  1. 1、Entity Framework Core 3.1入门教程-概述和准备工作

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

  2. 10、Entity Framework Core 3.1入门教程-执行原生SQL

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

  3. 2、Entity Framework Core 3.1入门教程-创建数据库和迁移

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

  4. ASP.NET Core 入门教程 8、ASP.NET Core + Entity Framework Core 数据访问入门

    一.前言 1.本教程主要内容 ASP.NET Core MVC 集成 EF Core 介绍&操作步骤 ASP.NET Core MVC 使用 EF Core + Linq to Entity ...

  5. ASP.NET Core 入门笔记9,ASP.NET Core + Entity Framework Core 数据访问入门

    一.前言 1.本教程主要内容 ASP.NET Core MVC 集成 EF Core 介绍&操作步骤 ASP.NET Core MVC 使用 EF Core + Linq to Entity ...

  6. Entity Framework Core 2.0 入门简介

    不多说废话了, 直接切入正题. EF Core支持情况 EF Core的数据库Providers: 此外还即将支持CosmosDB和 Oracle. EFCore 2.0新的东西: 查询: EF.Fu ...

  7. Entity Framework Core 2.0 入门

    该文章比较基础, 不多说废话了, 直接切入正题. 该文分以下几点: 创建Model和数据库 使用Model与数据库交互 查询和保存关联数据 EF Core支持情况 EF Core的数据库Provide ...

  8. ASP.NET Core 配置 Entity Framework Core - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 配置 Entity Framework Core - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 配置 Entity Fram ...

  9. 【目录】ASP.NET Core 2.1 入门教程

    ASP.NET Core 2.1 快速学习.入门系列教程,这个入门系列教程为了帮助大家快速上手ASP.NET Core. 本教程包含且不限于: 使用VS Code开发ASP.NET Core应用 AS ...

随机推荐

  1. MacOS下VUEJS简单入门

    微信搜索"艺术行者",关注并回复关键词"vue"获取课程资料 上传的在线学习视频(黑马和传智双元,感谢) VueJs概述与快速入门 学习之前假设你已了解关于 H ...

  2. PHP 命名空间(namespace)定义

    PHP 命名空间(namespace) PHP 命名空间(namespace)是在PHP 5.3中加入的,如果你学过C#和Java,那命名空间就不算什么新事物. 不过在PHP当中还是有着相当重要的意义 ...

  3. 下载excel模板,导入数据时需要用到

    页面代码: <form id="form1" enctype="multipart/form-data"> <div style=" ...

  4. day20:正则表达式

    单个字符的匹配 findall(正则表达式,字符串) 把符合正则表达式的字符串存在列表中返回 预定义字符集(8) \d 匹配数字 \D 匹配非数字 \w 匹配数字字母下划线 \W 匹配非数字或字母或下 ...

  5. ORACLE表与表联接的几种方式

    三大表与表联接方式 1.NESTED LOOPS 嵌套循环 2.HASH JOIN 哈希联接 3.SORT MERGE 排序合并联接 1.NESTED LOOPS  嵌套循环 嵌套循环的本质是将外部数 ...

  6. Spring学习总结(7)-AOP

    参考资料:https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html#aop 1 ...

  7. requests-html库轻体验-HTMLSession下载表情包

    requests-html实战,HTMLSession下载斗图啦最新表情包 前言 在这篇文章之前,我写了requests入门实践02_下载斗图拉最新表情包用正则表达式提取url,来下载斗图啦最新表情包 ...

  8. 33-关键字:interface

    interface:接口 1.使用说明: * 1.接口使用interface来定义 * 2.Java中,接口和类是并列的两个结构 * 3.如何定义接口:定义接口中的成员 * 3.1 JDK7及以前:只 ...

  9. Android Studio--APK打包

    首先在app的build.gradle里面加一下代码 lintOptions { checkReleaseBuilds false abortOnError false } 在上方Build里面找到G ...

  10. 老板让我从上千个Excel中筛选数据,利用Python分分钟解决!

    大家好,又到了Python办公自动化系列. 今天分享一个真实的办公自动化需求,大家一定要仔细阅读需求说明,在理解需求之后即可体会Python的强大! 很多人学习python,不知道从何学起.很多人学习 ...