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 information
            Console.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.mfbz.cn/a/268268.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python(上半部分)

第一部分 1、input()语句默认结果是字符串 2、type()可以判断变量的类型 3、input()输出语句 &#xff08;默认为字符串类型&#xff09; 4、命名规则&#xff1a;中文、英文、数字、_&#xff0c;数字不可开头&#xff0c;大小写敏感。 5、 %s&#xff1a;将内容转换成…

Java期末复习题之选择题理论综合

点击返回标题->23年Java期末复习-CSDN博客 选择题考察内容为—— 构造函数的描述&#xff0c;在文件中写入字符而不是字节选用什么类&#xff0c;java源文件import, class定义以及package的顺序&#xff0c;静态成员变量作用域&#xff0c;非抽象子类的接口实现&#xff0c;…

实现打印一个数字金字塔。例如:输入5,图形如下图所示

1*12**123***1234**** 12345*****#include<stdio.h> void main() {int i,j,l,n,k;scanf("%d",&n);/**********Program**********//********** End **********/ } 当我们拿到这个题目的时候可以看见题目给了我们五个变量&#xff0c;其中n是我们输入的数…

Elasticsearch 写入优化探索:是什么影响了refresh 耗时?

1、问题背景&#xff1a; 数据写入后&#xff0c;refresh耗时过长&#xff0c;能达到1s-5s。 想通过测试&#xff0c;探索确认影响refresh的因素&#xff0c;比如&#xff1a;写入操作是新增还是更新&#xff0c;deleted文档占比是否有影响&#xff0c;是否有其他索引配置&…

一、网络ensp安装

一、网络ensp安装https://blog.csdn.net/G_GUi/article/details/135176493 文章目录 一、下载4个软件安装二、工具栏常用图标 一、下载4个软件安装 前面3个软件必须要安装&#xff0c;不然用不了ensp https://pan.baidu.com/s/1kV7cL–BEbgANwSrZJ5t1Q?pwdqqqq 二、工具栏常…

【XML】TinyXML 详解(一):介绍

【C】郭老二博文之&#xff1a;C目录 1、简介 优点&#xff1a; TinyXML 是一个简单、小型的 C XML 解析器&#xff0c;可以轻松集成到项目中。 TinyXML 解析 XML 文档&#xff0c;并根据该文档构建可读取、修改和保存的文档对象模型 (DOM) TinyXML 是在 ZLib 许可下发布的&a…

AI一键注释代码、阅读整个项目、转换编程语言。已开源!

获取github源码地址和国内url、key方式&#xff1a;在文章底部 大家好今天给大家介绍一款开源项目&#xff0c;这个项目是由渡码维护的&#xff0c;这个项目支持自己的大模型和使用openai两种方式&#xff0c;本文章介绍使用openai的方式&#xff01; 使用过程中发现两个问题…

Java 第16章 坦克大战1-2 思路整理

文章目录 1 绘制坦克坦克画板Panel画框Frame 2 让坦克动起来画板Panel 3 本章作业 1 绘制坦克 坦克 不同坦克有共同属性&#xff0c;可以先提取共同特征&#xff08;坐标位置&#xff09;作为父类&#xff0c;然后其他坦克类继承它。 画板Panel 有坦克在画板上显示&#xf…

四. 基于环视Camera的BEV感知算法-PETR

目录 前言0. 简述1. 算法动机&开创性思路2. 主体结构3. 损失函数4. 性能对比5. PETRv2总结下载链接参考 前言 自动驾驶之心推出的《国内首个BVE感知全栈系列学习教程》&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考 本次课程我们来学习下课程第四章——基…

[MySQL binlog实战] 增量同步与数据搜索~从入门到精通

学习基础知识&#xff0c;并落实到实际场景&#xff08;增量同步数据搜索&#xff09; 对基础知识不感兴趣的&#xff0c;可以直接跳到应用场景 文章目录 binlog是什么简介产生方式文件格式statementrowmixed 怎么办开启 binlog查看 binlog其他查看相关命令运维查看 binlog设置…

mysql8.x版本_select语句源码跟踪

总结 源码基于8.0.34版本分析&#xff0c;函数执行流程含义大致如下&#xff1a; do_command 方法从连接中读取命令并执行&#xff0c;调用 dispatch_command 对命令进行分发。dispatch_command 调用 mysql_parse 对命令进行解析&#xff0c;如果遇到一条语句用 ; 分隔多条命…

猫头虎带您探索Go语言的魅力:GoLang程序员必备的第三方库大盘点 ‍ ‍

猫头虎带您探索Go语言的魅力&#xff1a;GoLang程序员必备的第三方库大盘点 ‍ &#x1f680;&#x1f431;‍&#x1f4bb; 博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#x…

Netty Review - 深入探讨Netty的心跳检测机制:原理、实战、IdleStateHandler源码分析

文章目录 概述心跳检测Code模拟心跳超时正常情况 IdleStateHandler源码分析channelReadchannelActiveinitialize 概述 心跳检测 Netty 的心跳检测机制是一种用于保持网络连接活跃的机制&#xff0c;它通过定期发送和接收特定的消息&#xff08;心跳包&#xff09;来确保客户端…

Java复习二—CH3-Exception 、CH4-I/O

CH3 Java Exception (异常) 3.1 Exception&#xff08;异常&#xff09;和 Error&#xff08;错误&#xff09; 异常能被程序本身可以处理&#xff0c;错误是无法处理 大多数错误与代码编写者执行的操作无关&#xff0c;而表示代码运行时 JVM 出现的问题 异常发生的原因有很…

电子科大软件系统架构设计——软件建模详细设计

文章目录 软件建模详细设计概述软件建模详细设计目标软件建模详细设计原则开闭原则里氏 (Liskov) 替换原则依赖倒置原则接口分离原则单一职责原则最少知识原则&#xff08;迪米特法则&#xff09;高内聚原则松耦合原则可重用原则 软件建模详细设计内容 UML 软件静态结构视图建模…

现代控制理论-李雅普诺夫

现代控制理论-李雅普诺夫 单输入单输出系统&#xff08;BIBO&#xff09;的系统函数如下&#xff1a; 则&#xff0c;该系统的能控标准型&#xff08;能空性&#xff09;为&#xff1a; 能观性&#xff1a; 李雅普诺夫下的稳定性&#xff1a; 李雅普诺夫下的渐进稳定性&a…

Ubuntu20.04纯命令配置PCL(点云库)

Ubuntu20.04纯命令配置PCL&#xff08;点云库&#xff09; 最近在学习点云库&#xff08;PCL&#xff09;的使用&#xff0c;第一步就是在自己的电脑安装配置PCL。 首先&#xff0c;对于ubuntu 16.04以上版本&#xff0c;可以直接使用命令进行安装&#xff0c;新建好一个文件夹…

小程序radio单选框回显

话不多说&#xff0c;效果图如下&#xff1a; 具体代码如下&#xff1a; <radio-group name"radio" bindchange"getSex"><label><radio value"1" checked"{{xingbie1}}" />男</label><label><radio…

Python序列之元组

系列文章目录 Python序列之列表 Python序列之元组 系列文章目录前言一、元组是什么&#xff1f;二、元组操作1.元组的创建&#xff08;1&#xff09;通过()创建。小括号可以省略。&#xff08;2&#xff09;通过tuple()函数创建。&#xff08;3&#xff09;通过生成器推导式创…

HBase 集群搭建

文章目录 安装前准备兼容性官方网址 集群搭建搭建 Hadoop 集群搭建 Zookeeper 集群解压缩安装配置文件高可用配置分发 HBase 文件 服务的启停启动顺序停止顺序 验证进程查看 Web 端页面 安装前准备 兼容性 1&#xff09;与 Zookeeper 的兼容性问题&#xff0c;越新越好&#…
最新文章