EFCore8分析类图映射到代码和数据库的示例

借用微软EFCore8官方的示例,我画了张类图:

blog(博客)与Post(文章)是1对多的关系,显式表达出两者间是双向导航:双方都可见。

Post(文章)与Tag(标签)是多对多的关系,单向导航:Post可见Tag,但是Tag不可见Post。

映射到代码(注意,手动改了一些地方,但是实体类是可用的):

using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.ComponentModel.DataAnnotations;
using Microsoft.EntityFrameworkCore;namespace MaxTools.EFCoreTest
{public class Blog{[Key]public int Id { get; set; }public string Name { get; set; }public string Owner { get; set; }public List<Post> Posts { get; set; }}
}
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.ComponentModel.DataAnnotations;
using Microsoft.EntityFrameworkCore;namespace MaxTools.EFCoreTest
{public class Post{[Key]public int Id { get; set; }public string Title { get; set; }public List<Tag> Tags { get; set; }[DeleteBehavior(DeleteBehavior.Cascade)]public Blog Blog { get; set; }}
}
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.ComponentModel.DataAnnotations;namespace MaxTools.EFCoreTest
{public class Tag{[Key]public int Id { get; set; }public string Name { get; set; }}
}

注意以上代码:

1)双向导航中,双方都有导航属性List<...> ...

2)单向导航中,只有一方有属性List<...> ...

另外,需要考虑“组合关系”的时候,手动在代码里加映射属性,如下:

PostgresContext

using System;
using System.Collections.Generic;
using Microsoft.EntityFrameworkCore;namespace MaxTools.EFCoreTest;public partial class PostgresContext : DbContext
{public PostgresContext(){}public PostgresContext(DbContextOptions<PostgresContext> options): base(options){}protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
#warning To protect potentially sensitive information in your connection string, you should move it out of source code. You can avoid scaffolding the connection string by using the Name= syntax to read it from configuration - see https://go.microsoft.com/fwlink/?linkid=2131148. For more guidance on storing connection strings, see https://go.microsoft.com/fwlink/?LinkId=723263.=> optionsBuilder.UseNpgsql("PORT=5432;DATABASE=postgres;HOST=localhost;PASSWORD=postgres;USER ID=postgres;");protected override void OnModelCreating(ModelBuilder modelBuilder){OnModelCreatingPartial(modelBuilder);}partial void OnModelCreatingPartial(ModelBuilder modelBuilder);// DbSet 属性表示数据库中的表public DbSet<Blog> BlogSet { get; set; }public DbSet<Post> PostSet { get; set; }public DbSet<Tag> TagSet { get; set; }
}

客户端程序

using System;
using Microsoft.EntityFrameworkCore;namespace MaxTools.EFCoreTest
{public class Program{static void Main(){// See https://aka.ms/new-console-template for more informationConsole.WriteLine("Hello, World!");// Tag tag1 = new Tag();// tag1.Name = "testTag1";// Tag tag2 = new Tag();// tag2.Name = "testTag2";// List<Tag> tags1 = new List<Tag>();// tags1.Add(tag1);// tags1.Add(tag2);// Tag tag3 = new Tag();// tag3.Name = "testTag3";// Tag tag4 = new Tag();// tag4.Name = "testTag4";// List<Tag> tags2 = new List<Tag>();// tags2.Add(tag3);// tags2.Add(tag4);// Post post1 = new Post();// post1.Title = "post1";// post1.tags = tags1;// Post post2 = new Post();// post2.Title = "post2";// post2.tags = tags2;// List<Post> posts = new List<Post>();// posts.Add(post1);// posts.Add(post2);// Blog blog = new Blog();// blog.Name = "testBlog";// blog.Owner = "Zhang";// blog.Posts = posts;// PostgresContext context = new PostgresContext();// context.BlogSet.Add(blog);// int count = context.SaveChanges();// Console.WriteLine(count);// //删除PostgresContext context = new PostgresContext();Blog blog = context.BlogSet.Include(x => x.Posts).ThenInclude(x => x.Tags).FirstOrDefault(x => x.Id == 1);context.Remove(blog);int count = context.SaveChanges();Console.WriteLine(count);}}
}

在数据库中的表现为:

把逻辑的思考与数据库设计分离开。

以上代码经测可以级联删除,数据库是Postgres 16.1。

附件:【免费】blog中的示例代码,EFCore8+Postgres实现,调试通过资源-CSDN文库

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

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

相关文章

1.数字反转

题目 AC import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt();if(n>0) {StringBuilder str new StringBuilder();str.append(n);StringBuilder str1 str.reverse();String st…

oss文件操作(文件列举、文件大小)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

微服务实战系列之Dubbo(上)

前言 随着一年一度冬至的到来&#xff0c;2023的步伐也将远去。而博主的系列文章&#xff0c;也将从今天起&#xff0c;越来越聚焦如何构建微服务“内核”上。前序系列文章几乎囊括了微服务的方方面面&#xff0c;无论使用什么框架、组件或工具&#xff0c;皆可拿来用之。 那么…

DaVinci各版本安装指南

链接: https://pan.baidu.com/s/1g1kaXZxcw-etsJENiW2IUQ?pwd0531 ​ #2024版 1.鼠标右击【DaVinci_Resolve_Studio_18.5(64bit)】压缩包&#xff08;win11及以上系统需先点击“显示更多选项”&#xff09;【解压到 DaVinci_Resolve_Studio_18.5(64bit)】。 2.打开解压后的文…

什么是网站监控?

网站监控是跟踪网站的可用性和性能&#xff0c;以最小化宕机时间&#xff0c;优化性能并确保顺畅的用户体验。维护网站正常运行对于任何企业来说都是至关重要的&#xff0c;因而对大多数业务来说&#xff0c;网站应用监控都是一个严峻的挑战。Applications Manager网站应用监控…

基于SSM的剧本杀预约系统(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的剧本杀预约系统&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring Sp…

<JavaEE> 协议格式 -- 传输层协议 UDP

目录 一、UDP协议格式长啥样&#xff1f; 二、端口号和IP地址 1&#xff09;UDP协议中包含哪两个端口号&#xff1f; 2&#xff09;有没有包含IP地址&#xff1f; 三、UDP报文长度 1&#xff09;UDP报文长度最长多长&#xff1f; 2&#xff09;UDP报文的组成&#xff1f…

项目管理4321方法论

文章目录 一、项目立项准备&#xff08;4步&#xff09;case1、识别价值---解决背后痛点的才是价值&#xff0c;价值是做任何事情的出发点case2、明确目标---支撑价值实现的&#xff0c;目标是 具体/可衡量/可达到/相关性/有时限的case3、识别干系人---找对人才能做对事&#x…

数学的雨伞下:理解世界的乐趣

这本书没有一个公式&#xff0c;却讲透了数学的本质&#xff01; 《数学的雨伞下&#xff1a;理解世界的乐趣》。一本足以刷新观念的好书&#xff0c;从超市到对数再到相对论&#xff0c;娓娓道来。对于思维空间也给出了一个更容易理解的角度。 作者&#xff1a;米卡埃尔•洛奈…

数学建模之聚类模型详解

聚类模型 引言 “物以类聚&#xff0c;人以群分”&#xff0c;所谓的聚类&#xff0c;就是将样本划分为由类似的对象组成的多个类的过程。聚类后&#xff0c;我们可以更加准确的在每个类中单独使用统计模型进行估计、分析或预测&#xff1b;也可以探究不同类之间的相关性和主…

实在没货,简历(软件测试)咋写?

简历咋写&#xff0c;这是很多没有【软件测试实际工作经验】的同学们非常头疼的事情。 简历咋写&#xff1f;首先你要知道简历的作用。 简历的作用是啥呢&#xff1f; 一句话就是&#xff1a;让HR小姐姐约你。 如何让HR看你一眼&#xff0c;便相中你的简历&#xff0c;实现在众…

原来电脑并不需要重装系统才能恢复出厂设置,这个操作学起来!

前言 小伙伴们应该都知道手机上有恢复出厂设置的功能&#xff0c;如果想要把手机送给朋友或者卖给别人&#xff0c;就会先恢复出厂设置。 但换到Windows电脑上之后&#xff0c;如果出现同样的情况&#xff0c;就会第一时间想到重装系统。就好像Windows电脑上不存在恢复出厂设…