一、建立文章、评论类

 /// <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. linux安装flink

    参考链接https://blog.csdn.net/boling_cavalry/article/details/85038527   1.下载flink 在Flink官网下载,地址是:https:/ ...

  2. FLink16--计数窗口--CountWindiwApp

    一.依赖 https://www.cnblogs.com/robots2/p/16048648.html 二.代码 概念:窗口来多少条计算一次,存在滚动和滑动两种情况 package net.xdcl ...

  3. 8款支持 C# 语言的 AI 辅助编程神器,高效编程利器!

    前言 在当今这个AI技术日新月异的时代,一股创新的浪潮正席卷着软件开发领域,其中AI辅助编程工具以其独特的魅力脱颖而出,成为了众多开发者不可或缺的得力助手.这些工具不仅能够显著提升开发效率,优化代码质 ...

  4. 正权图的 Dijkstra 最短路算法

    最短路径问题是图论中最经典且重要的应用问题之一.它的目标是找到一个图中从起点到终点的最短路径,即在所有可能的路径中,选择一条边权和最小的路径.该问题广泛存在于多个实际场景中,比如交通运输.通信网络.导 ...

  5. elementUI中如何在Tabs标签页的标题文字后面添加文字或图标

    1.效果如下: 实现代码如下:<el-tab-pane name="first"> <span slot="label"> <sp ...

  6. 数据挖掘 | 数据隐私(2) | 差分隐私 | 数据重构化攻击(Reconstruction Attacks)

    L2-Reconstruction Attacks 本节课的目的在于正式地讨论隐私,但是我们不讨论算法本身有多隐私,取而代之去讨论一个算法隐私性有多么的不可靠.并且聚焦于 Dinur 与 Nissim ...

  7. CF2067D Object Identification

    CF2067D - Object Identification 题目大意 有一个对你公开的 \(x\) 数组和一个对你隐藏的 \(y\) 数组,保证没有任何两个相同的 \(\{x_i, y_i\}\) ...

  8. PHP 命名空间与spl_autoload_register() 自动加载机制

    转:https://www.cnblogs.com/chihuobao/p/9895202.html include 和 require 是PHP中引入文件的两个基本方法.在小规模开发中直接使用 in ...

  9. C# USB 摄像头 OpenCV 视频picBox呈现,抓拍图像保存呈现。没有注释版本。

    1.winform 应用程序,两个picturebox空间,一个用于视频呈现,一个用于抓拍呈现. 2.引用包OpenCvSharp4.OpenCvSharp4.Extensions.OpenCvSha ...

  10. 前端跨域方案-跨域请求代理(asp.net handler)

    现在技术开发偏向于使用统一的接口处理浏览器或者app的http请求. 大家都知道因为浏览器的同源策略的原因 js直接请求webapi 接口会有一些问题,即使做好服务器端的配置 同样会有不少的 问题   ...