本文章是根据 微软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. PHP array_flip() 函数

    ------------恢复内容开始------------ 实例 反转数组中的键名和对应关联的键值: <?php$a1=array("a"=>"red&qu ...

  2. PHP sqrt() 函数

    实例 返回不同数的平方根: <?phpecho(sqrt(0) . "<br>");echo(sqrt(1) . "<br>"); ...

  3. PHP ucwords() 函数

    实例 把每个单词的首字符转换为大写: <?php高佣联盟 www.cgewang.comecho ucwords("hello world");?> 定义和用法 ucw ...

  4. PHP time_nanosleep() 函数

    实例 延迟执行当前脚本 3,5 秒: <?phpif (time_nanosleep(3,500000000) === true){高佣联盟 www.cgewang.comecho " ...

  5. windows:进程查杀

    windows平台中,某些进程做了各种保护,比如hook了terminateProcess,又或者注册了进程终止函数的回调.当调用这些API或任务管理器终止该进程时,会被绕过,典型如某些杀毒软件,怎么 ...

  6. VS c# 操作 Microsoft Project mpp 文件 并遍历边关系

    网上找到资料提供了遍历.mpp文件中任务的功能: http://blog.csdn.net/gxf36/article/details/5253792 ======================== ...

  7. 6、单例模式 Singleton模式 只有一个实例 创建型模式

    1.了解Singleton模式 程序在运行时,通常都会生成很多实例.例如,表示字符串的java . lang . string类的实例与字符串是- -对- -的关系,所以当有1000个字符串的时候,会 ...

  8. 在龙芯mips64el平台编译bmon

    bmon 是一个 实时命令行流量监控软件,但作者在github并没有提供mips64el的版本.下面记录一下编译过程.可以在这里下载bmon.v4.0.linux-mips64el.tar.gz. 环 ...

  9. AI顶会

    自己如何学习CV paper with code(每周) 基石方向 1.image classification 这个肯定要关注,这个往往都是backbone https://paperswithco ...

  10. Vue视图渲染原理解析,从构建VNode到生成真实节点树

    前言 在 Vue 核心中除了响应式原理外,视图渲染也是重中之重.我们都知道每次更新数据,都会走视图渲染的逻辑,而这当中牵扯的逻辑也是十分繁琐. 本文主要解析的是初始化视图渲染流程,你将会了解到从挂载组 ...