杨中科 EFCORE 第六部分 一对多关系配置

一对多关系配置

什么是实体间关系

1、所谓“关系数据库”
2、复习:数据库表之间的关系: 一对一、一对多、多对多。
3、EF Core不仅支持单实体操作,更支持多实体的关系操作。4、三部曲:实体类中关系属性;FluentAPI关系配置;使用关系操作。

一对多: 实体类

1、文章实体类Article、评论实体类Comment。一篇文章对应多条评论。

public class Article
{	public long Id { get; set;}public string Title( get; set;}public string Content{ get; set;}public List<Comment> Comments { get; set;}= new List<Comment>()
}
public class Comment
{public long Id { get; set; )public Article Article ( get; set; )public string Message ( get; set; )
}

示例:
新建Article类
在这里插入图片描述

新建Comment 类
在这里插入图片描述

一对一: 关系配置

EF Core中实体之间关系的配置的套路
Hasxxx(…).Withxxx(…)
有XXX、反之带有XXX
XXX可选值One、Many

对多: HasOne(…).WithMany(…);
一对一:HasOne(…).WithOne (…);
多对多:HasMany (…).WithMany(…);

一对一: 关系配置

class ArticleConfig :IEntityTypeConfiguration<Article>
{public void Configure(EntityTypeBuilder<Article> builder){builder.ToTable("T Articles");builder.Property(a =>a.Content).IsRequired().IsUnicode();builder.Property(a =>a.Title).IsRequired().IsUnicode().HasMaxLength(255);}}

一对多: 关系配置

class CommentConfig :IEntityTypeConfiguration<Comment>
{public void Configure(EntityTypeBuilder<Comment>builder){builder.ToTable("T_Comments");builder.HasOne<Article>(c=>c.Article).WithMany(a =>a.Comments).IsRequired();builder.Property(c=>c.Message).IsRequired0.IsUnicode();}}

引入包
在这里插入图片描述

新建ArticleConfig
在这里插入图片描述

新建CommentConfig
在这里插入图片描述

新建 myDbcontext

在这里插入图片描述

执行迁移命令
在这里插入图片描述
在这里插入图片描述

查看数据库
在这里插入图片描述

在这里插入图片描述

一对一: 试验

1、迁移生成数据库表。
2、编写代码测试数据插入。
3、不需要显式为Comment对象的Article属性赋值 (当前赋值也不会出错),也不需要显式地把新创建的Comment类型的对象添加到DbContext中。EF Core会顺竿爬”

示例:
编写测试代码
只需要将父对象 插入Dbcontext中 ,即可
在这里插入图片描述

运行:
查看表数据
在这里插入图片描述
在这里插入图片描述

这样分别写也是同样的效果:
在这里插入图片描述

一对多关系数据的获取

获取关系数据

Article a =
ctx.Articles.Include(a=>a.Comments).Single(a=>aId==1);
Console.WriteLine(a.Title);foreach(Comment c in a.Comments)
{Console.WriteLine(c.Id+":"+c.Message);
}

Include定义在Microsoft.EntityFrameworkCore命名空间中。
查看一下生成的SQL语句

获取Id=2的 Article

在这里插入图片描述
运行结果:
在这里插入图片描述

文章下的所有评论

在这里插入图片描述
运行结果:
在这里插入图片描述
没有comment内容

设置断点查看一下
在这里插入图片描述
这种情况是不对的 ,按理应该有两条对应的评论

查看生成的sql语句,来查找问题所在
在这里插入图片描述
发现只查询了T-Articles没有关联查询T-Comment

解决方法,加上 include
表示插叙的时候,不仅查询Articles对应的表,也要关联查询Comment对应的表

修改之后
在这里插入图片描述
运行结果:
在这里插入图片描述
查看此时生成的sql语句
在这里插入图片描述

查询id=3对应的信息,以及文章信息

在这里插入图片描述
在这里插入图片描述
发生异常
TheArticle为null
在这里插入图片描述
此时生成的sql语句,没有查询Article对应的数据表
在这里插入图片描述

要想查询到数据,同样要使用include
在这里插入图片描述
此时运行结果:
在这里插入图片描述
对应生成的sql语句
在这里插入图片描述

额外的外键字段

上述操作中不是已经有了一个TheArticleId外键字段了吗?

虽然生成了外键,但是Comment实体中并没有对应表中TheArticleId字段的字段。
因为没有必要,TheArticle就能把对应的文章ID 取出来了

但是有的情况下,可能需要这一个属性,来单独获取外键值

为什么需要外键属性

1、EF Core会在数据表中建外键列。
2、如果需要获取外键列的值,就需要做关联查询,效率低。试一下。
3、需要一种不需要Join直接获取外键列的值的方式。

示例:
查询TheArticle 必须使用 include 关键字,此时查询是通过inner join 连接,但是此时Comment表中,是应该有 TheArtice这个字段的,是不需要连表查询的
在这里插入图片描述
生成的SQL语句
在这里插入图片描述

直接查询单表,就能查询到TheAricleId
在这里插入图片描述

方式一

首先,只想获取表中某些字段
在这里插入图片描述
结果:
在这里插入图片描述
运行的sql 语句
在这里插入图片描述
发现他 查询了 Id,Message,Title 都查出来了,但是此时用不上Message

使用Select 的映射操作,只获取需要的类型

在这里插入图片描述
此时,查看生成的SQL 语句

在这里插入图片描述

此时尝试,使用这种方式,能否获取到想要的数据,而不通过连表操作
在这里插入图片描述
运行的SQL
在这里插入图片描述
还是使用了连表查询

级联Select,获取数据,其实是不需要使用到include的,他是会在必要的使用自动加上include
这里把 include 关键字去掉,再次尝试
在这里插入图片描述
此时生成的SQL 语句 还是有 join 操作
在这里插入图片描述

正确的解决方法,单独给Comment 增加一个属性,和TheArticleI对应
在这里插入图片描述
由于不会对数据库造成任何改变,此时不需要,在执行 迁移命令
在关系中,告诉底层 ,新增的TheArticleId 就是外键列
在这里插入图片描述

此时修改代码
在这里插入图片描述

此时的sql 语句 便没有join操作
在这里插入图片描述

设置外键属性

1、在实体类中显式声明一个外键属性
2、关系配置中通过HasForeignKey(c=>c.ArticleId)指定这个属性为外键。
3、除非必要,否则不用声明,因为会引入重复

导航属性

由一个实体的属性,可以访问到另外一个实体的属性
在这里插入图片描述
在这里插入图片描述
这两者 都是导航属性,这种两则对应的属于,双向导航属性
在这里插入图片描述

有时双向的麻烦

有时,一些基础表,可能被多次引用

在这里插入图片描述
在这里插入图片描述

示例:

新建User 类
在这里插入图片描述
新建Leave类,请假
在这里插入图片描述
配置表,UserConfig
在这里插入图片描述
配置表 LeaveConfig
在这里插入图片描述
配置DBContext
在这里插入图片描述

配置方法

不设置反向的属性,然后配置的时候WithMany0不设置参数即可

在这里插入图片描述

执行数据迁移命令
在这里插入图片描述
在这里插入图片描述
查看数据库
在这里插入图片描述
查询数据测试

在这里插入图片描述
生成的sql语句
在这里插入图片描述
插入语句测试
在这里插入图片描述
数据库
在这里插入图片描述

选择

对于主从结构的“一对多”表关系,一般是声明双向导航属性。
而对于其他的“一对多”表关系: 如果表属于被很多表引用的基础表,则用单项导航属性,否则可以自由决定是否用双向导航属性。

关系配置在任何一方都可以

在这里插入图片描述

反着配置也可以

CommentConfig:
builder.HasOne

(c=>c.Article).WithMany(a=>a.Comments).IsRequired0;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/628578.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Rust】get_local_info 0.2.4发布

发布0.2.4&#xff0c;修正0.2.3&#xff08;[我的Rust库更新]get_local_info 0.2.3-CSDN博客&#xff09;中存在的峰值算法bug&#xff0c;现已提交力扣并通过&#xff0c;耗时0ms

基于JavaWeb+BS架构+SpringBoot+Vue健美操评分系统系统的设计和实现

基于JavaWebBS架构SpringBootVue健美操评分系统系统的设计和实现 文末获取源码Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 文末获取源码 Lun文目录 目 录 1 绪 论 1 1.1背景与意义 1 1.2 国内外研究概况 1 1.3 研究的内容…

浅析企业微电网能效系统建设——安科瑞赵嘉敏

一 案例介绍 随着新型电力系统进程加快&#xff0c;新能源装机占比逐步提高&#xff0c;发电侧波动性、随机性导致可靠容量降低。加之极端天气带动负荷快速增长&#xff0c;造成电力供需紧张、电网尖峰负荷屡创新高&#xff0c;对现有能源供应带来巨大挑战。 国家电投五凌电力…

【数据结构 | 直接选择排序】

直接选择排序 基本思路直接插入排序SelectSort 基本思路 直接插入排序&#xff08;StraightInsertionSort&#xff09;的基本操作是将一个记录插入到已经排好序的有序表中&#xff0c;从而得到一个新的、记录数增1的有序表。 我们可以同时从数组的头部和尾部同时进行排序工作…

UE4使用技巧

打开蓝图编辑器时不是打开一个新窗口&#xff0c;而是作为主窗口 适用于全部的打开新窗口的操作 蓝图编译时自动保存 开始游戏后立即捕获鼠标

Linux 内核被冬季风暴 “封印“

Linus Torvalds在内核邮件列表上宣布&#xff0c;由于他所在的美国俄勒冈州波特兰地区受到严重冬季风暴的影响&#xff0c;导致网络和电力中断。波特兰及其周边地区气温急降至零下 -10C&#xff0c;因此他不得不临时中断对Linux 6.8内核的合并窗口操作。 Linus于1月7日发布了Li…

PyTorch损失函数(二)

损失函数 5、nn.L1Loss nn.L1Loss是一个用于计算输入和目标之间差异的损失函数&#xff0c;它计算输入和目标之间的绝对值差异。 主要参数&#xff1a; reduction&#xff1a;计算模式&#xff0c;可以是none、sum或mean。 none&#xff1a;逐个元素计算损失&#xff0c;返…

MongoDB 启动提示错误code=killed, signal=ABRT

1.停止MongoDB sudo systemctl stop mongod 2.检查数据损坏 sudo mongod --repair --dbpath /var/lib/mongodb 3.赋权限 chown -R mongodb:mongodb /var/lib/mongodb chown mongodb:mongodb /tmp/mongodb-27017.sock 如果不赋权限&#xff0c;启动的时候则会提示 4.启动Mo…

静态路由添加404页面

静态路由添加404页面 引入404页面路由代码&#xff1a; {path: *,name: 404,component: () > import(/views/page404)}404页面样式

meter报OOM错误,如何解决?

根据在之前的压测过程碰到的问题&#xff0c;今天稍微总结总结&#xff0c;以后方便自己查找。 一、单台Mac进行压测时候&#xff0c;压测客户端Jmeter启动超过2000个线程&#xff0c;Jmeter报OOM错误&#xff0c;如何解决&#xff1f; 解答&#xff1a;单台Mac配置内存为8G&…

小红书青年文化洞察:新“旷野文学”兴起,用户回归人间清醒?

社交媒体的“议程设置”能够影响用户的关注焦点&#xff0c;乃至影响舆论风向&#xff0c;但是以UGC生态为主的小红书&#xff0c;受众手中的话语权影响力变大&#xff0c;用户能识别、参与&#xff0c;甚至抵抗议程设置。 用户越来越清醒&#xff0c;不再是“电视喂什么&…

MySQL的单表查询

单表查询的素材&#xff1a; 一、单表查询 素材&#xff1a; 表名&#xff1a;worker-- 表中字段均为中文&#xff0c;比如 部门号 工资 职工号 参加工作 等 CREATE TABLE worker ( 部门号 int(11) NOT NULL, 职工号 int(11) NOT NULL, 工作时间 date NOT NULL, 工资 floa…

在linux环境下安装lnmp

lnmp官网&#xff1a;https://lnmp.org 一&#xff1a;lnmp安装 参考&#xff1a;https://lnmp.org/install.html 1&#xff1a;下载lnmp安装包 wget https://soft.lnmp.com/lnmp/lnmp2.0.tar.gz -O lnmp2.0.tar.gz 2&#xff1a;解压lnmp安装包 tar zxf lnmp2.0.tar.gz …

01章【JAVA开发入门】

计算机基本概念 计算机组成原理 计算机组装 计算机&#xff1a;电子计算机&#xff0c;俗称电脑。是一种能够按照程序运行&#xff0c;自动、高速处理海量数据的现代化智能电子设备。由硬件和软件所组成&#xff0c;没有安装任何软件的计算机称为裸机。常见的形式有台式计算机、…

leetcode-344. 反转字符串、9. 回文数

题目1&#xff1a; 解题方法 直接用reverse()即可 代码&#xff1a; class Solution(object):def reverseString(self, s):""":type s: List[str]:rtype: None Do not return anything, modify s in-place instead."""return s.reverse()如果不…

动态规划day09(打家劫舍,树形dp)

目录 198.打家劫舍 看到题目的第一想法 看到代码随想录之后的想法 自己实现过程中遇到的困难 213.打家劫舍II 看到题目的第一想法 看到代码随想录之后的想法 自己实现过程中遇到的困难 337.打家劫舍 III(树形dp) 看到题目的第一想法 看到代码随想录之后的想法 自己实…

PLC绝对定位指令DDRVA往复运动(三菱FX系列简单状态机编程)

有关状态机的具体介绍,专栏有很多文章,大家可以通过下面的链接查看: https://rxxw-control.blog.csdn.net/article/details/125488089https://rxxw-control.blog.csdn.net/article/details/125488089三菱FX系列回原功能块介绍 https://rxxw-control.blog.csdn.net/article…

【MATLAB】 HANTS滤波算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~ 1 基本定义 HANTS滤波算法是一种时间序列谐波分析方法&#xff0c;它综合了平滑和滤波两种方法&#xff0c;能够充分利用遥感图像存在时间性和空间性的特点&#xff0c;将其空间上的分布规律和时间上的变化规律联系起来…

怎么把一个网站地址生成二维码?扫码跳网站页面

怎么把一个网站地址生成二维码&#xff1f;现在经常会发现扫描日常生活中的一些二维码会跳转到一个对应的网站页面&#xff0c;那么这种类型的二维码是如何生成的呢&#xff1f;如果大家也想要将网址生成二维码图片使用&#xff0c;那么最简单快捷的方法就是找合适的二维码生成…

单片机中的PWM(脉宽调制)的工作原理以及它在电机控制中的应用。

目录 工作原理 在电机控制中的应用 脉宽调制&#xff08;PWM&#xff09;是一种在单片机中常用的控制技术&#xff0c;它通过调整信号的脉冲宽度来控制输出信号的平均电平。PWM常用于模拟输出一个可调电平的数字信号&#xff0c;用于控制电机速度、亮度、电压等。 工作原理 …