第1章 数据库及其表的自动生成与前言

news2025/7/19 11:21:15

001 RootEntityTkey<Tkey>、BlogArticle

    RootEntityTkey<Tkey>:该实体类以泛型形式,定义了当前程序中所有实体的自增型主键。

    BlogArticle:继承了RootEntityTkey<Tkey>,通过该实体类及其属性成员,用于实现当前程序【Blog】.【模型】.【模型集】.【博客文章】实体与“[Blog].[BlogArticle]”表之间的CURD的交互操作,并把这些数据存储到数据库设置实例中(内存)。

002 ConsoleHelper、UtilConvert、FileHelper、JsonHelper、MainDb

    ConsoleHelper:通过该类中的方法,在锁定状态下在控制台上打印:以指定颜色(错误--红色(ConsoleColor.Red)/警告--黄色(ConsoleColor.Yellow)/正常--白色(ConsoleColor.White)/成功--绿色(ConsoleColor.Green))的文字渲染显示指定信息

UtilConvert:该类静态方法的形式自定义了一些常用的类型转换方法,把1个指定实例转换为指定的类型。

FileHelper:该类定义了对本地文件的读写操作。

JsonHelper:该类用于把指定文件中的数据或实例按照JSON编码格式,转换为JSON编码格式的实例

MainDb:通过该类中的静态变量成员的编号常量值, 设定与当前程序进行数据交互操作的默认数据库软件为:Sqlite(相当于定义了1个相对于整个程序的全局常量)。

003 Appsettings、DataBaseType、MutiDBOperate、BaseDBConfig、SqlsugarSetup、MyContext、DBSeed、SeedDataMiddleware

       Appsettings:通过该类中的方法,从“appsettings.json”配置文件中获取指定的数据信息,为指定中间件的实例化提供数据支撑。

    DataBaseType:该枚举定义了6种数据库软件,“SqlSugarCore”中间件结合该枚举实例选定其中(MySql/Microsoft SqlServer/Sqlite/Oracle/PostgreSQL/Dm(达梦)/Kdbndp(人大金仓))的1种,

MutiDBOperate:如果“SqlSugarCore”中间件启用多数据库支持,则从“appsettings.json”配置文件中获取数据库软件配置信息存储到该类的实例中。

 注意:

     默认是不启用多数据库支持的。

       BaseDBConfig:通过该类中的静态方法从“appsettings.json”或“*.txt”文件中获取个指定数据库的连接字符串数据信息。

       SqlsugarSetup:把SqlSugar中间件实例注入到内置容器中,为“MyContext”类的实例化提供支撑。

       MyContext:该类在获取“SqlSugarCore”中间件实例后,并通过该类中的方法成员实现当前程序与指定数据库的数据交换操作。

       DBSeed:该类用于在Code-Frist模式下,在指定的数据库软件中自动生成指定的数据库及其表,同时把指定文件中的初始化数据持久化到相应的表中。

       SeedDataMiddleware:通过该类中的方法成员把数据库及其表的自动生成操作集成到NetCore框架内置管道中,在Code-First模式下,以保证在程序执行时如果没有与之相对应的数据库,

则在指定的数据库软件中自动生成数据库及其表,并将初始化数据持久化到对应的表中。

1 appsettings.json

{

  "AppSettings": {

    //"RedisCachingAOP": {

    //  "Enabled": false

    //},

    //"MemoryCachingAOP": {

    //  "Enabled": true

    //},

    //"LogAOP": {

    //  "Enabled": false

    //},

    //"TranAOP": {

    //  "Enabled": false

    //},

    //"SqlAOP": {

    //  "Enabled": true,

    //  "OutToLogFile": {

    //    "Enabled": false

    //  },

    //  "OutToConsole": {

    //    "Enabled": true

    //  }

    //},

    //"LogToDb": {

    //  "Enabled": true

    //},

    //"Date": "2018-08-28",

    "SeedDBEnabled": true, //只生成表结构

    "SeedDBDataEnabled": true //生成表,并初始化数据

    //"Author": "Blog.Core",

    //"SvcName": "", // /svc/blog

    //"UseLoadTest": false

  },

  // 请配置MainDB为你想要的主库的ConnId值,并设置对应的Enabled为true;

  // *** 单库操作,把 MutiDBEnabled 设为false ***;

  // *** 多库操作,把 MutiDBEnabled 设为true,其他的从库Enabled也为true **;

  // 具体配置看视频:https://www.bilibili.com/video/BV1BJ411B7mn?p=6

  "MainDB": "WMBLOG_SQLITE", //当前项目的主库,所对应的连接字符串的Enabled必须为true

  "MutiDBEnabled": false, //是否开启多库模式

  "CQRSEnabled": false, //是否开启读写分离模式,必须是单库模式,且数据库类型一致,比如都是SqlServer

  "DBS": [

    /*

      对应下边的 DBType

      MySql = 0,

      SqlServer = 1,

      Sqlite = 2,

      Oracle = 3,

      PostgreSQL = 4,

      Dm = 5,//达梦

      Kdbndp = 6,//人大金仓

    */

    {

      "ConnId": "WMBLOG_SQLITE",

      "DBType": 2,

      "Enabled": false,

      "HitRate": 50, // 值越大,优先级越高

      "Connection": "WMBlog.db" //sqlite只写数据库名就行

    },

    {

      "ConnId": "Blog",

      "DBType": 1,

      "Enabled": true,

      "HitRate": 40,

      "Connection": "Data Source=.;Initial Catalog=Blog;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",

      "ProviderName": "System.Data.SqlClient"

    },

    {

      "ConnId": "WMBLOG_MSSQL_2",

      "DBType": 1,

      "Enabled": false,

      "HitRate": 30,

      "Connection": "Data Source=(localdb)\\MSSQLLocalDB;Initial Catalog=WMBLOG_MSSQL_2;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False",

      "ProviderName": "System.Data.SqlClient"

    },

    {

      "ConnId": "WMBLOG_MYSQL",

      "DBType": 0,

      "Enabled": false,

      "HitRate": 20,

      "Connection": "server=.;Database=ddd;Uid=root;Pwd=123456;Port=10060;Allow User Variables=True;"

    },

    {

      "ConnId": "WMBLOG_MYSQL_2",

      "DBType": 0,

      "Enabled": true,

      "HitRate": 20,

      "Connection": "server=localhost;Database=blogcore001;Uid=root;Pwd=root;Port=3306;Allow User Variables=True;"

    },

    {

      "ConnId": "WMBLOG_ORACLE",

      "DBType": 3,

      "Enabled": false,

      "HitRate": 10,

      "Connection": "Data Source=127.0.0.1/ops;User ID=OPS;Password=123456;Persist Security Info=True;Connection Timeout=60;"

    },

    {

      "ConnId": "WMBLOG_DM",

      "DBType": 5,

      "Enabled": false,

      "HitRate": 10,

      "Connection": "PORT=5236;DATABASE=DAMENG;HOST=localhost;PASSWORD=SYSDBA;USER ID=SYSDBA;"

    },

    {

      "ConnId": "WMBLOG_KDBNDP",

      "DBType": 6,

      "Enabled": true,

      "HitRate": 10,

      "Connection": "Server=127.0.0.1;Port=54321;UID=SYSTEM;PWD=system;database=SQLSUGAR4XTEST1;"

    }

  ],

  "Logging": {

    "LogLevel": {

      "Default": "Information",

      "Microsoft.AspNetCore": "Warning"

    }

  },

  "AllowedHosts": "*"

}

2 Program.cs

using Common.Helper;

using Common.Seed;

using Extensions.Middlewares;

using Extensions.ServiceExtensions;

var builder = WebApplication.CreateBuilder(args);

//把“AppSettings”实例,依赖注入到.Net(Core)6框架内置容器中。

builder.Services.AddSingleton(new AppSettings(builder.Configuration));

//把“SqlSugar”中间件实例,依赖注入到.Net(Core)6框架内置容器中。

builder.Services.AddSqlsugarSetup();

//把数据库交互上下文实例,依赖注入到.Net(Core)6框架内置容器中。

builder.Services.AddScoped<MyContext>();

builder.Services.AddControllers();

// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle

builder.Services.AddEndpointsApiExplorer();

builder.Services.AddSwaggerGen();

var app = builder.Build();

// Configure the HTTP request pipeline.

if (app.Environment.IsDevelopment())

{

    app.UseSwagger();

    app.UseSwaggerUI();

}

app.UseHttpsRedirection();

app.UseAuthorization();

app.MapControllers();

//把数据库及其表的自动生成操作集成到NetCore框架内置管道中,(在Code-First模式下)以保证在程序执行时如果没有与之相对应的数据库,

// 则在指定的数据库软件中自动生成数据库及其表,并将初始化数据持久化到对应的表中。

var scope = app.Services.GetRequiredService<IServiceScopeFactory>().CreateScope();

var myContext = scope.ServiceProvider.GetRequiredService<MyContext>();

app.UseSeedDataMiddle(myContext, builder.Environment.WebRootPath);

app.Run();

3 前言

    该系列的文章及其代码是对“老张的哲学”博客项目的分解实现源代码地址:

    1、GitHub - anjoy8/Blog.Core: 💖 ASP.NET Core 6.0 全家桶教程,前后端分离后端接口,vue教程姊妹篇,官方文档:(后端)。

    2、GitHub - anjoy8/Blog.Admin: ✨ 基于vue 的管理后台,配合Blog.Core与Blog.Vue等多个项目使用(前端)。

    3、10分钟学会Blog.Core(ASP.NETCORE)基本完结_哔哩哔哩_bilibili(视频)

    说实说老张拥有1流的工程实现能力,但讲课能力却是战五渣水平,但对Blog.Core(后端)项目的理解也有一定的帮助,同时Blog.Core(后端)项目为了示例的需要实现了多数据库持的扩展,但在实现工程实现中,这种方式是不被提倡和使用的,同时Blog.Core(后端) 项目示例性多些,而工程性相对少些。

       好的学习视频推荐:

       前端:【uni-app】2021最新版uni-app零基础入门到项目实战#Vue#项目实战_哔哩哔哩_bilibili(高洛峰)。

       前/后端:厉害了,零基础学Vue3+.NET6电商实战,全程现场撸码!(Vue3.0/.NET6.0/NET Core/JWT/电商实战/WebAPI/sql)B0793_哔哩哔哩_bilibili(朝夕教育)。

注意:

       初学者本人建议不要一上来就看视频,因为视频学习是效率和效果最差的学习方式,毕竟软件工作是1门实践性的学科,老师的始终是老师的,如果你不经历开发中的困苦,这些知识就不会是你的。而是找一个开源项目从头到尾的自己实现3遍以上,只有经历了实现过程中的困苦,再来看这些视频就会极其快速的获取这些视频中对自己有用的知识点。

       对以上功能更为具体实现和注释见:221118_01Blog(数据库及其表的自动生成)。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于sklearn的机器学习实战

本文目录如下&#xff1a;LinearRegression线性回归入门数据生成定义模型模型测试与比较多项式回归具体实现LogisticRegression算法思想简述算法实现Decision TreeMLPSVM线性SVM多项式核高斯核对比不同核在Mnist上的效果读取数据高斯核多项式核线性核NBayesbagging与随机森林Ad…

适用于Linux的6个最佳Python IDE

早在 1991 年&#xff0c;当Guido van Rossum第一次引入 Python 时&#xff0c;他不会想到 Python 的未来发展这么好。现在我们在这里规模地使用Python构建项目。根据 2022 年的一份报告&#xff0c;Python 在全球拥有 29.53% 的份额&#xff0c;位居榜首。 Python 的设计牢记…

④开启shift后门实验报告

班级 计科1班 姓名 彭彭头 学号 时间 2022.05.13 成绩 实验项目名称 开启shift后门 实验目的 1、了解常用入侵主机的方法 2、掌握操作系统常见漏洞&#xff0c;并学会防范 实验内容 利用Windows7系统的shift漏洞&#xff0c;开启后门。 实验环境 操作系统&a…

分布式前修课:Zookeeper锁实现方式

前言 聊完MySQL和Redis&#xff0c;我们接下来在聊一聊Zookeeper。相信大家都已经发现了&#xff0c;这些都是我们在开发过程非常常用的技术。搞定他们&#xff0c;一切难题都不在话下。 Zookeeper&#xff0c;盘它 官网是我们学习某一种技术框架的第一手资料&#xff0c;通…

JAVA泛型

泛型的由来 因为JAVA中假如构建了一个object集合&#xff0c;在集合里存储任何的数据类型对象&#xff0c;定义了一个字符串&#xff0c;又定义一个常数。呢么在遍历数组Arraylist的时候&#xff0c;在代码行里并不会报错&#xff0c;但是运行之后会出现ClassCastException异常…

传奇私服开服架设教程 传奇服务端设置教程

首先开区要使用两个必备的软件&#xff1a;DBC2000、传奇引擎&#xff0c;当然也少不了传奇服务端(传奇服务端在论坛免费服务端和商业服务端中有下载)。 先把下载好的服务端解压到D盘或者某个般的根目录(所谓根目录&#xff0c;就是D盘或E盘&#xff0c;不是D盘和E盘的某个文件…

TCN代码详解-Torch (误导纠正)

1. 绪论 TCN网络由Shaojie Bai&#xff0c; J. Zico Kolter&#xff0c; Vladlen Koltun 三人于2018提出。对于序列预测而言&#xff0c;通常考虑循环神经网络结构&#xff0c;例如RNN、LSTM、GRU等。他们三个人的研究建议我们&#xff0c;对于某些序列预测&#xff08;音频合…

基于Matlab仿真极化双基地雷达系统(附源码)

目录 一、系统设置 二、系统仿真 三、使用圆极化接收阵列 四、总结 五、程序 此示例演示如何仿真极化双基地雷达系统以估计目标的范围和速度。发射器、接收器和目标运动学被考虑在内。 一、系统设置 该系统以 300 MHz 的频率运行&#xff0c;使用线性 FM 波形&#xff0…

Devkit代码迁移工具——smartdenovo源码迁移

smartdenovo源码迁移 迁移前准备工作 1、服务器和操作系统正常运行。 2、PC端已经安装SSH远程登录工具。 3、Porting Advisor已在准备好的x86平台环境和鲲鹏平台环境中完成安装并正常运行。 4、待迁移的相关软件包、源代码已准备就绪。 迁移步骤 1、利用Porting Advisor的源码…

人工智能学习:ResNet神经网络(8)

ResNet是一种非常有效的图像分类识别的模型&#xff0c;可以参考如下的链接 https://blog.csdn.net/qq_45649076/article/details/120494328 ResNet网络由残差&#xff08;Residual&#xff09;结构的基本模块构成&#xff0c;每一个基本模块包含几个卷积层。其中&#xff0c;…

【MySQL数据库笔记 - 进阶篇】(五)锁

✍个人博客&#xff1a;https://blog.csdn.net/Newin2020?spm1011.2415.3001.5343 &#x1f4da;专栏地址&#xff1a;暂定 &#x1f4dd;视频地址&#xff1a;黑马程序员 MySQL数据库入门到精通 &#x1f4e3;专栏定位&#xff1a;这个专栏我将会整理 B 站黑马程序员的 MySQL…

硬件科普系列之显示篇——LCD与OLED知多少

前言 无论是手机还是电脑&#xff0c;作为机器与人交互最为频繁的硬件设备&#xff0c;显示屏一直是决定用户体验最为关键的因素之一。大家近几年在购买手机的时候&#xff0c;可以发现目前大部分手机都在使用OLED屏幕&#xff0c;那么你有没有思考过为什么各大厂商都在大力推…

jupuyter的背景主题

jupuyter的背景主题一.背景主题安装查看可用主题1.主题安装2. **查看可用主题**3.更换主题&#xff0c;字体等其他设置4.其他命令&#xff0c;还原原本主题二.每个主题的效果1.chesterish2. grade33.gruvboxd4.oceans165.onedork6.solarizedd7.solarizedl一.背景主题安装查看可…

上帝视角看Vue源码整体架构+相关源码问答

前言 这段时间利用课余时间夹杂了很多很多事把 Vue2 源码学习了一遍&#xff0c;但很多都是跟着视频大概过了一遍&#xff0c;也都画了自己的思维导图。但还是对详情的感念模糊不清&#xff0c;故这段时间对源码进行了总结梳理。 本篇文章更合适于已看过 Vue2 源码&#xff0c…

使用NNI对DLASeg剪枝的失败记录

本文希望对CenterNet算法的Backbone暨DLASeg进行剪枝。 剪枝试验涉及3个文件&#xff0c;分别为&#xff1a; DCN可变性卷积dcn_v2.py&#xff0c;因为DLASeg依赖DCN。 #!/usr/bin/env python from __future__ import absolute_import from __future__ import print_functio…

如何在 Windows 10上修复0x000006ba错误

修复0x000006ba错误 可能导致此错误代码的原因已确认的可行的解决办法运行打印机疑难解答重新启动后台打印程序服务清除 PRINTERS 文件夹运行 SFC 和 DISM 扫描启用打印机共享某些 Windows 10 在尝试在 Windows 10 上打印新文档时遇到0x000006ba错误代码。其他用户在尝试使用 W…

【面试题】line-height继承问题

1. line-height为具体数值 当父元素line-height的值为具体数值的时候&#xff0c;例如30px&#xff0c;则子元素的line-height直接继承该数值。 <style>body{font-size: 20px;line-height: 50px;}p{background-color: #ccc;font-size: 16px;} </style><body&g…

类和对象的初步介绍

文章目录面向对象的初步认识什么是面向对象面向对象与面向过程类定义和使用简单认识类类的定义格式随堂练习定义一个学生类类的实例化什么是实例化类和对象的说明this 引用为什么要有this引用什么时this引用this引用的特性对象的构造和初始化构造方法概念特性默认初始化就地初始…

Shell脚本学习指南(三)——文本处理工具

文章目录排序文本行的排序以字段的排序文本块排序sort的效率sort的稳定性sort小结删除重复重新格式化段落计算行数、字数以及字符数打印打印技术的演化其他打印软件提取开头或结尾数行排序文本 含有独立数据记录的文本文恶剪&#xff0c;通常都可以拿来排序。一个可预期的记录…

Vue3 - 组件通信(父传子)

前言 在 Vue3 中&#xff0c;父组件向子组件传参的方法。 与 Vue2 相比&#xff0c;还是有一些区别的。 基础示例 现在我们的需求是&#xff0c;要通过父组件&#xff0c;传递一个标题来让子组件显示。 子组件 Com.vue&#xff1a; <template><div>{{ title }}&l…