EFCore Study(3)——“一”对多关系的设定和插入、查找级联操作
一、建立文章、评论类
/// <summary>
/// 文章
/// </summary>
public class Artitle
{
public int Id { get; set; }
public string Ttile { get; set; }
public string Content { get; set; } public List<Comment> Comments = new List<Comment>();//评论
}
/// <summary>
/// 评论
/// </summary>
public class Comment
{
public int Id { get; set; }
public string Message { get; set; }
//每个评论都有对应的文章
public Artitle theArtitle { get; set; } }
二、创建数据库操作类及对应的建表映射关系类
/// <summary>
/// 文章映射关系类
/// </summary>
class ArtitleMaps : IEntityTypeConfiguration<Artitle>
{
public void Configure(EntityTypeBuilder<Artitle> builder)
{
builder.ToTable("artitle");
builder.Property(b => b.Id).IsUnicode().ValueGeneratedOnAdd();
builder.Property(b => b.Ttile).IsRequired().HasMaxLength(50);
builder.Property(b => b.Content).IsRequired().HasMaxLength(50);
}
}
此时一对多的关系我们在Comment映射类中指定(同样也可以在Artitle指定)
/// <summary>
/// 评论映射关系类
/// </summary>
public class CommentMap:IEntityTypeConfiguration<Comment>
{ public void Configure(EntityTypeBuilder<Comment> builder)
{
builder.ToTable("comment");
builder.Property(b => b.Id).IsUnicode().ValueGeneratedOnAdd();
builder.Property(b => b.Message).IsRequired().HasMaxLength(50);
//指定一个外键theArtitle,artitle包含多个Comments
builder.HasOne<Artitle>(a=>a.theArtitle).WithMany(c=>c.Comments).IsRequired();
}
}
如果在Article里指定

DBContext工具类(我们引用的是开源的 Pomelo.EntityFrameworkCore;UseMySql,和EFCore Study(1)里引用自带MYSql类库的不同)
/// <summary>
/// 论坛DBContext
/// </summary>
public class ForumDBContext:DbContext
{
public DbSet<Artitle> artitles { get; set; }
public DbSet<Comment> comments { get; set; }
private const string ConnectionString = "server=127.0.0.1;port=3306;database=efcorestudy;uid=root;pwd=root;"; protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
base.OnConfiguring(optionsBuilder);
//我们引用的是开源的 Pomelo.EntityFrameworkCore;UseMySql方法有所不同
optionsBuilder.UseMySql(ConnectionString, new MySqlServerVersion(new Version(8, 0, 23)));
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
modelBuilder.ApplyConfigurationsFromAssembly(this.GetType().Assembly);
} }
三、数据生成
还是选择工具-->NuGet包管理器--->程序包管理器控制台--->输入命令:Add-Migration init -->执行完后再输入命令: Update-Database
生成情况:
Artitle:

Comment:

生成外键theAritleId

四、级联操作
在Program.cs里
class Program
{
static void Main(string[] args)
{
using (var context = new ForumDBContext())
{
//操作代码
}
}
}
#关系插入
Artitle ac = new Artitle() { Ttile = "俄罗斯在日本领域发射导弹", Content = "2021年10月21日俄罗斯占领日本领域。。。。。。" };
Comment c1 = new Comment() { Message = "太刚了" };
Comment c2 = new Comment() { Message = "不愧是战斗民族" };
//通过实体类指定一对多关系
ac.Comments.Add(c1);
ac.Comments.Add(c2);
//只需要将“一”插入数据库,“一”对应的“多”因为已经在实体类里指定,也会被EFCore一同插入
context.artitles.Add(ac);
context.SaveChanges();


#关系查找——“一”到多
//关联查询-
//Include(a=>a.Comments)查询包含评论Comments
//artitle的Id == 1
var artitle = context.artitles.Include(a=>a.Comments).Single<Artitle>(ar => ar.Id == 1);
Console.WriteLine(artitle.Id+","+artitle.Ttile);
foreach (var item in artitle.Comments)
{
Console.WriteLine(item.Id+","+item.Message);
}

//查看执行的sql:
var artitle = context.artitles.Include(a => a.Comments).Single<Artitle>(ar => ar.Id == 1);
IQueryable<Artitle> list = context.artitles.Include(a => a.Comments).Where(ar => ar.Id == 1);
var query = list.ToQueryString();
Console.WriteLine("query:"+query);

#关系查找——多到“一”
//关联查询——从多到一
//查出Id == 1的评论及评论对应的文章
var comment = context.comments.Include(c => c.theArtitle).Single<Comment>(c => c.Id == 1);
Console.WriteLine("评论:" + comment.Message);
Console.WriteLine("评论对应文章:" + comment.theArtitle.Ttile);

//查看执行的sql
IQueryable<Comment> list = context.comments.Include(c => c.theArtitle);
var query = list.ToQueryString();
Console.WriteLine("query:" + query);

EFCore Study(3)——“一”对多关系的设定和插入、查找级联操作的更多相关文章
- dgraph解决社交关系中的正反向查找
dgraph解决社交关系中的正反向查找 本篇介绍的是, 社交关系中的关注者与被关注者在dgraph中如何实现查找. 对dgraph的基本操作不太清楚的可以看看我之前写的博客 dgraph实现基本操作 ...
- Hibernate第三天——表间关系与级联操作
第三天,我们来使用Hibernate进行表之间一对多 多对多关系的操作: 这里我们先利用两个例子进行表关系的回顾: 一对多(重点): 例如分类和商品的关系,一个分类多个商品,一个商品属于一个分类 CR ...
- Python3-sqlalchemy-orm 多对多关系建表、插入数据、查询数据
现在来设计一个能描述"图书"与"作者"的关系的表结构,需求是 一本书可以有好几个作者一起出版 一个作者可以写好几本书 此时你会发现,用之前学的外键好像没办法实现 ...
- ORM对象关系映射之使用GreenDAO进行CRUD操作
在Android中,我们都知道使用的数据库是SQLite,而使用这种原生的数据库非常繁琐,它对表的管理和进行CRUD操作都需要我们写sql语句,在进行多表关联的操作上,更是需要写一堆sql,而且维护起 ...
- mysql-表关系介绍(应用较多)
目录 表之间的关系(重点) foreign key (外键) 级联操作 (cascade) 两种级联操作 外键的使用 多对一(一对多) 多对多 一对一关系 表之间的关系(重点) foreign key ...
- MYSQL基础操作
MYSQL基础操作 [TOC] 1.基本定义 1.1.关系型数据库系统 关系型数据库系统是建立在关系模型上的数据库系统 什么是关系模型呢? 1.数据结构可以规定,同类数据结构一致,就是一个二维的表格 ...
- List-----Array
1.Definition Arry数组是一种连续储存的List 储存方式:将线性表中的元素一次储存在连续的储存空间中. Computer's logical structure: 逻辑位置上相邻的元素 ...
- Spring Data JPA 初体验
一,JPA相关的概念 JPA概述 全称是:JavaPersistence API.是SUN公司推出的一套基于ORM的规范. Hibernate框架中提供了JPA的实现. JPA通过JDK 5.0注解或 ...
- SSH框架之hibernate《四》
hibernate第四天 一.JPA相关概念 1.1JPA概述 全称是:Java Persistence API.是sun公司推出的一套基于ORM的规范 ...
- Hibernate一对多OnetoMany
------------------------Hibernate一对多OnetoMany 要点: 配置在一端. 1.如果是单向关联,即只在一端配置OneToMany,多端不配置ManyToOne.则 ...
随机推荐
- .NET周刊【1月第2期 2025-01-12】
国内文章 [.NET] API网关选择:YARP还是Ocelot? https://www.cnblogs.com/madtom/p/18655530 本文详细比较了YARP和Ocelot两种API网 ...
- mount命令及挂载本地yum源
mount命令 mount [-t vfstype] [-o options] device dir 其中: 1.-t vfstype 指定文件系统的类型,通常不必指定.mount 会自动选择正确的类 ...
- tomcat配置用户名密码
1.配置tomcat-user.xml<role rolename="manager-gui"/><role rolename="manager-scr ...
- 导出数据EPPlus
前言 导出数据在管理系统中经常要用到,目前的Excel导出工具多种多样,如:NPOI.EPPlus等--本篇使用的是EPPlus,记录下在工作中用到的导入导出类,以便后面使用 代码 导出 public ...
- go实现设计模式(1)——简介
六大原则 开闭原则(Open Close Principle) 对扩展开放,对修改关闭.对程序进行拓展时,尽量不去修改原有的代码,应该通过扩展实体的行为来实现. 里氏替换原则(Liskov Subst ...
- stay:将代码翻译为Gif动图,妈妈再也不用担心我调试找不到bug了
本文首发于微信公众号:呼哧好大枫.原作者与本文作者是同一人. 平常在做算法题或者是 debug 的时候很需要一款能够实时地将代码执行逻辑和数据以图形化的形式渲染出来的工具.之前尝试了几款(visual ...
- 使用mongodb、Kafka保存mqtt消息
一.引言 随着物联网技术的迅猛发展,大量的设备和传感器产生了海量的数据.本文利用了 MQTT.Kafka 和 MongoDB 各自的优点,满足实时数据处理和大规模数据存储的需求. 如图: 二.总结 优 ...
- C# Web下的类库 项目中获取程序的运行路径
System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase
- 使用mybatis-plus转换枚举值
1. 使用mybatis-plus转换枚举值 枚举值转换方式有很多,有以下方式: 后端写一个通用方法,只要前端传枚举类型,后端返回相应的枚举值前端去匹配 优点:能够实时保持数据一致性 缺点:如果有大量 ...
- mysql8导入myslq5 报错
打开sql文件替换 我的数据库编码是utf8mb4,如果你的数据库编码是别的,替换成你自己的编码. utf8mb4_0900_ai_ci替换为utf8mb4_general_ci