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(数据库及其表的自动生成)。