一、建立文章、评论类

 /// <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)——“一”对多关系的设定和插入、查找级联操作的更多相关文章

  1. dgraph解决社交关系中的正反向查找

    dgraph解决社交关系中的正反向查找 本篇介绍的是, 社交关系中的关注者与被关注者在dgraph中如何实现查找. 对dgraph的基本操作不太清楚的可以看看我之前写的博客 dgraph实现基本操作 ...

  2. Hibernate第三天——表间关系与级联操作

    第三天,我们来使用Hibernate进行表之间一对多 多对多关系的操作: 这里我们先利用两个例子进行表关系的回顾: 一对多(重点): 例如分类和商品的关系,一个分类多个商品,一个商品属于一个分类 CR ...

  3. Python3-sqlalchemy-orm 多对多关系建表、插入数据、查询数据

    现在来设计一个能描述"图书"与"作者"的关系的表结构,需求是 一本书可以有好几个作者一起出版 一个作者可以写好几本书 此时你会发现,用之前学的外键好像没办法实现 ...

  4. ORM对象关系映射之使用GreenDAO进行CRUD操作

    在Android中,我们都知道使用的数据库是SQLite,而使用这种原生的数据库非常繁琐,它对表的管理和进行CRUD操作都需要我们写sql语句,在进行多表关联的操作上,更是需要写一堆sql,而且维护起 ...

  5. mysql-表关系介绍(应用较多)

    目录 表之间的关系(重点) foreign key (外键) 级联操作 (cascade) 两种级联操作 外键的使用 多对一(一对多) 多对多 一对一关系 表之间的关系(重点) foreign key ...

  6. MYSQL基础操作

    MYSQL基础操作 [TOC] 1.基本定义 1.1.关系型数据库系统 关系型数据库系统是建立在关系模型上的数据库系统 什么是关系模型呢? 1.数据结构可以规定,同类数据结构一致,就是一个二维的表格 ...

  7. List-----Array

    1.Definition Arry数组是一种连续储存的List 储存方式:将线性表中的元素一次储存在连续的储存空间中. Computer's logical structure: 逻辑位置上相邻的元素 ...

  8. Spring Data JPA 初体验

    一,JPA相关的概念 JPA概述 全称是:JavaPersistence API.是SUN公司推出的一套基于ORM的规范. Hibernate框架中提供了JPA的实现. JPA通过JDK 5.0注解或 ...

  9. SSH框架之hibernate《四》

    hibernate第四天     一.JPA相关概念         1.1JPA概述             全称是:Java Persistence API.是sun公司推出的一套基于ORM的规范 ...

  10. Hibernate一对多OnetoMany

    ------------------------Hibernate一对多OnetoMany 要点: 配置在一端. 1.如果是单向关联,即只在一端配置OneToMany,多端不配置ManyToOne.则 ...

随机推荐

  1. V-Control 开箱即用的.NET MAUI组件库发布了!

    之前写过挺多的MAUI Sample,其中有很多代码可以打包成组件,当组件完善到一定程度,我会把控件封装起来放到控件库中. 今天,在这个仓库建立一年零八个月后,我觉得可以考虑将其作为开源库发布. 有很 ...

  2. 免费的天气接口api(腾讯)

    请求URL: https://wis.qq.com/weather/common请求方式: GET参数: 参数名 必选 类型 说明 source 是 string pc weather_type 是 ...

  3. Jenkins插件:Publish over SSH

    Jenkins插件:Publish over SSH Jenkins作为一个开源的持续集成和交付工具,通过插件扩展可以实现各种功能.其中,Publish over SSH插件是Jenkins的一个常用 ...

  4. 《Vue2 框架第二课:组件结构与模板语法详解》

    写在开头:Vue.js 是一个流行的前端框架,广泛应用于构建用户界面和单页应用(SPA).然而,需要注意的是,Vue2 已经于 2023 年底 正式停止维护.这意味着官方团队将不再为 Vue2 提供功 ...

  5. Ruoyi-vue 左侧菜单栏默认保持收缩

    在项目的 src\store\modules\app.js 路径下 sidebar: { opened: Cookies.get('sidebarStatus') ? !!+Cookies.get(' ...

  6. MySQL - [09] 正则表达式

    转载:https://mp.weixin.qq.com/s/7RavuYGs9SthX2pxGJppqw select * from t1 where name rlike '^[a-zA-Z]+$' ...

  7. linux安装lspci

    点击查看代码 `lspci` 是一个用于在Linux系统中显示所有PCI总线以及已连接设备信息的命令.这个工具通常包含在 `pciutils` 包里.如果你需要在你的Linux系统上安装 `lspci ...

  8. C/C++ 创建Socket实现双工通信

    点击查看代码 实现简单的Socket通信 服务端代码(Server) #include <stdio.h> #include <winsock2.h> #pragma comm ...

  9. angular+ionic项目,页面无法滚动的问题

    在做angular+ionic+cordova项目时,遇到一个小小的问题,就是内容做完,页面无法滚动,导致内容显示不完整 首先我检查了样式,发现并没有给页面定死高度,再次检查结构发现,我并没有用ion ...

  10. React.memo 解决函数组件重复渲染

    为什么会存在重复渲染? react 在 v16.8 版本引入了全新的 api,叫做 React Hooks,它的使用与以往基于 class component 的组件用法非常的不一样,不再是基于类,而 ...