浅入 ABP 系列(6):数据库配置

版权护体作者:痴者工良,微信公众号转载文章需要 《NCC开源社区》同意。

本系列的第五篇:https://www.cnblogs.com/whuanle/p/13061059.html

因为这一部分属于 ASP.NET Core 的基础部分,ABP 没有封装,因此没啥要说的。

这一篇我们将来学习如何在 ABP 中添加数据库配置以及划分一个简单数据库模块的结构,我们将使用 EFCore + Freesql 来搭建数据库模块。

强烈推荐 Freesql!Freesql 是叶老师出品的 ORM 框架,现在属于 NCC 成员项目,Freesql 解决了我很多在日常开发中的痛点,并且其对业务开发的考虑和众多有些的拓展功能,实在令我爱不释手!

AbpBase.Database 中,通过 Nuget 添加以下几个库:

版本都是 1.9.0-preview0917,你可以使用最新版本的。

Freesql
FreeSql.Provider.Sqlite
FreeSql.Provider.SqlServer
FreeSql.Provider.MySql

创建标准的 EFCore 数据库上下文

在 ABP 中,EFCore 上下文类需要继承 AbpDbContext<T>,整体编写方法跟继承 DbContext<T> 一致 ,接下来我们将一步步来讲解在 AbpBase 中如何添加 EFCore 功能。

连接字符串

ABP 中,可以在上下文类加上一个 ConnectionStringName 特性,然后在配置服务时,ABP 会自动为其配置连接字符串。

    [ConnectionStringName("Default")]
public partial class DatabaseContext : AbpDbContext<DatabaseContext>

Default 是一个标识,你也可以填写其他字符串标识。

定义隔离的上下文

首先,我们在 AbpBase.Database 模块中,创建两个文件夹:

BaseData
ExtensionData

BaseData 目录用来存放基础表结构的上下文,ExtensionData 用来存放可能会拓展或者经常变动的表结构。

在 BaseData 中创建一个 AbpBaseDataContext 类,其内容如下:

using Microsoft.EntityFrameworkCore;
using Volo.Abp.Data;
using Volo.Abp.EntityFrameworkCore; namespace AbpBase.Database
{
/// <summary>
/// 上下文
/// <para>这部分用于定义和配置基础表的映射</para>
/// </summary>
[ConnectionStringName("Default")]
public partial class AbpBaseDataContext : AbpDbContext<AbpBaseDataContext>
{ #region 定义 DbSet<T> #endregion public AbpBaseDataContext(DbContextOptions<AbpBaseDataContext> options)
: base(options)
{
} /// <summary>
/// 定义映射
/// </summary>
/// <param name="modelBuilder"></param>
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
#region 定义 映射 #endregion OnModelCreatingPartial(modelBuilder);
} partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
}
}

在 ExtensionData 中也创建一个相同的 AbpBaseDataContext 类,其内容如下:

using Microsoft.EntityFrameworkCore;

namespace AbpBase.Database
{ public partial class AbpBaseDataContext
{
#region 定义 DbSet<T> #endregion /// <summary>
/// 定义映射
/// </summary>
/// <param name="modelBuilder"></param>
partial void OnModelCreatingPartial(ModelBuilder modelBuilder)
{ }
}
}

分部类,前者用于定义那些非常基础的,程序核心的实体(表)以及映射。而后者定义后续可能多次修改的,设计时感觉有设计余地的。

多数据库支持和配置

这里我们将对上下文进行配置和注入,使得程序能够支持多数据库。

AbpBase.Domain.Shared 项目中,创建一个枚举,其内容如下:

namespace AbpBase.Domain.Shared
{
public enum AbpBaseDataType
{
Sqlite = 0,
Mysql = 1,
Sqlserver = 2 // 其他数据库
}
}

再创建一个 WholeShared 类,其内容如下:

namespace AbpBase.Domain.Shared
{
/// <summary>
/// 全局共享内容
/// </summary>
public static class WholeShared
{
// 数据库连接属性可以自行在配置文件中定义,这里写固定的,只是为了演示 /// <summary>
/// 数据库连接字符串
/// </summary>
public static readonly string SqlConnectString = ""; /// <summary>
/// 要使用的数据库类型
/// </summary>
public static readonly AbpBaseDataType DataType = AbpBaseDataType.Sqlite;
}
}

然后我们在 AbpBaseDatabaseModule 模块中的 ConfigureServices 函数里面添加依赖注入:

context.Services.AddAbpDbContext<AbpBaseDataContext>();

这里不需要配置数据库连接字符串,后面可以通过 ABP 的一些方法来配置。

配置上下文连接字符串

            string connectString = default;
Configure<AbpDbConnectionOptions>(options =>
{
connectString = WholeShared.SqlConnectString;
options.ConnectionStrings.Default = connectString;
});

配置多数据库支持:

            FreeSql.DataType dataType = default;

            Configure<AbpDbContextOptions>(options =>
{
switch (WholeShared.DataType)
{
case AbpBaseDataType.Sqlite:
options.UseSqlite<AbpBaseDataContext>(); dataType = FreeSql.DataType.Sqlite; break;
case AbpBaseDataType.Mysql:
options.UseMySQL<AbpBaseDataContext>(); dataType = FreeSql.DataType.MySql; break;
case AbpBaseDataType.Sqlserver:
options.UseSqlServer<AbpBaseDataContext>(); dataType = FreeSql.DataType.SqlServer; break;
}
});

这样就完成了对 EFCore 的多数据库配置了。

下面我们来使用类似的方法配置 Freesql。

Freesql 配置服务

首先,Freesql 里面有多种配置方式,例如 DbContext,读者可以到 Wiki 去学习 Freesqlhttps://github.com/dotnetcore/FreeSql/wiki/%E5%85%A5%E9%97%A8

笔者这里使用的是 “非正规” 的设计方式,哈哈哈哈。

BaseData 目录中,创建一个 FreesqlContext 类,其内容如下:

using FreeSql.Internal;
using System;
using System.Collections.Generic;
using System.Text; namespace AbpBase.Database
{
/// <summary>
/// Freesql 上下文
/// </summary>
public partial class FreesqlContext
{
public static IFreeSql FreeselInstance => Freesql_Instance;
private static IFreeSql Freesql_Instance; public static void Init(string connectStr, FreeSql.DataType dataType = FreeSql.DataType.Sqlite)
{
Freesql_Instance = new FreeSql.FreeSqlBuilder()
.UseNameConvert(NameConvertType.PascalCaseToUnderscore)
.UseConnectionString(dataType, connectStr) //.UseAutoSyncStructure(true) // 自动同步实体结构到数据库,生产环境禁止使用! .Build();
OnModelCreating(Freesql_Instance);
} private static void OnModelCreating(IFreeSql freeSql)
{ OnModelCreatingPartial(freeSql);
}
}
}

ExtensionData 目录中,创建 FreesqlContext 类 如下:

using FreeSql;
using System;
using System.Collections.Generic;
using System.Text; namespace AbpBase.Database
{
public partial class FreesqlContext
{
private static void OnModelCreatingPartial(IFreeSql freeSql)
{
var modelBuilder = freeSql.CodeFirst; SyncStruct(modelBuilder); } /// <summary>
/// 同步结构到数据中
/// </summary>
/// <param name="codeFirst"></param>
private static void SyncStruct(ICodeFirst codeFirst)
{
// codeFirst.SyncStructure(typeof(user));
}
}
}

然后在 AbpBaseDatabaseModuleConfigureServices 函数中添加注入服务:

            FreesqlContext.Init(connectString, dataType);
context.Services.AddSingleton(typeof(IFreeSql), FreesqlContext.FreeselInstance);
context.Services.AddTransient(typeof(FreesqlContext), typeof(FreesqlContext));

通过以上步骤,我们的 ABP 就可以支持多数据库了,EFCore + Freesql,并且将将表分级隔离维护。

浅入 ABP 系列(6):数据库配置的更多相关文章

  1. 浅入 ABP 系列(4):事件总线

    浅入 ABP 系列(4):事件总线 版权护体作者:痴者工良,微信公众号转载文章需要 <NCC开源社区>同意. 目录 浅入 ABP 系列(4):事件总线 事件总线 关于事件总线 为什么需要这 ...

  2. 浅入ABP(1):搭建基础结构的 ABP 解决方案

    浅入ABP(1):搭建基础结构的 ABP 解决方案 目录 浅入ABP(1):搭建基础结构的 ABP 解决方案 搭建项目基础结构 ApbBase.Domain.Shared 创建过程 ApbBase.D ...

  3. 浅入深出Vue:工具准备之WebStorm安装配置

    浅入深出Vue之工具准备(一):WebStorm安装配置 工欲善其事必先利其器,让我们先做好准备工作吧 导航篇 WebStorm安装配置 所有工具的下载地址都可以在导航篇中找到,这里我们下载的是最新版 ...

  4. Spring的数据库编程浅入浅出——不吹牛逼不装逼

    Spring的数据库编程浅入浅出——不吹牛逼不装逼 前言 上文书我写了Spring的核心部分控制反转和依赖注入,后来又衔接了注解,在这后面本来是应该写Spring AOP的,但我觉得对于初学者来说,这 ...

  5. 浅入深出Vue:工具准备之PostMan安装配置及Mock服务配置

    浅入深出Vue之工具准备(二):PostMan安装配置 由于家中有事,文章没顾得上.在此说声抱歉,这是工具准备的最后一章. 接下来就是开始环境搭建了~尽情期待 工欲善其事必先利其器,让我们先做好准备工 ...

  6. 浅入深出Vue系列

    浅入深出Vue导航 导航帖,直接点击标题即可. 文中所有涉及到的资源链接均在最下方列举出来了. 前言 基础篇 浅入深出Vue:工具准备之WebStorm搭建及配置 浅入深出Vue之工具准备(二):Po ...

  7. 重新学习MySQL数据库2:『浅入浅出』MySQL 和 InnoDB

    重新学习Mysql数据库2:『浅入浅出』MySQL 和 InnoDB 作为一名开发人员,在日常的工作中会难以避免地接触到数据库,无论是基于文件的 sqlite 还是工程上使用非常广泛的 MySQL.P ...

  8. Mybatis源码解析,一步一步从浅入深(三):实例化xml配置解析器(XMLConfigBuilder)

    在上一篇文章:Mybatis源码解析,一步一步从浅入深(二):按步骤解析源码 ,中我们看到 代码:XMLConfigBuilder parser = new XMLConfigBuilder(read ...

  9. 基于DDD的现代ASP.NET开发框架--ABP系列之2、ABP入门教程

    基于DDD的现代ASP.NET开发框架--ABP系列之2.ABP入门教程 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET Boi ...

  10. 基于DDD的现代ASP.NET开发框架--ABP系列文章总目录

    ABP相关岗位招聘:给热爱.NET新技术和ABP框架的朋友带来一个高薪的工作机会 ABP交流会录像视频:ABP架构设计交流群-7月18日上海线下交流会的内容分享(有高清录像视频的链接) 代码自动生成: ...

随机推荐

  1. 源码补丁神器—patch-package

    一.背景 vue项目中使用 vue-pdf第三方插件预览pdf,书写业务代码完美运行,pdf文件内容正常预览无问题.后期需求有变,业务需求增加电子签章功能.这个时候pdf文件的内容可以显示出来,但是公 ...

  2. electron-builder

    electron-builder打包工具 首先,确保你的项目中已经安装了 electron-builder.可以在项目根目录下运行以下命令来安装它: npm install electron-buil ...

  3. 虚幻引擎 4 学习笔记 [1] :蓝图编程 Demo

    虚幻引擎 4 学习笔记 [1] :蓝图编程 Demo ​ 最近学习虚幻引擎,主要看的是 Siki 学院的课,课程链接:Unreal蓝图案例 - 基础入门 - SiKi学院|SiKi学堂 - unity ...

  4. 在cmd(命令行)或bat文件切换盘符

    bat文件 写一个自动更新git的bat文件,如果bat文件放在E盘,想要去到D盘的某个目录下执行命令,代码如下: SET ksf=D:\code\KSFramework @echo on d: cd ...

  5. MindSpore导入CUDA算子

    技术背景 当今众多的基于Python的AI框架(如MindSpore.PyTorch等)给了开发者非常便利的编程的条件,我们可以用Python的简单的语法写代码,然后由框架在后端自动编译成可以在GPU ...

  6. MASA学习和总结

    一.MASA概述 MASA是温州数闪科技推出的开源产品,目前有三个产品线,分别是MASA Stack,MASA Framework,MASA Blazor. MASA Stack:是一个开源.企业级. ...

  7. 零基础入门学习JAVA课堂笔记 ——DAY07

    面向对象(下) 1. Instanceof 我们可以通过Instanceof关键词可以判断当前对象是否为某某类得父类 Object instanceof Student //true 注意:只有是两个 ...

  8. 执行orachk检查数据库环境

    Exadata环境巡检需要执行专有的exachk,而普通Oracle环境可以通过执行orachk来检查集群和数据库相关健康状况. 1.使用orachk检查健康状态 使用root用户执行,期间可能需要多 ...

  9. 记录一则exachk进程占用大量CPU资源

    有Exadata客户在进行exachk巡检之后反馈,发现系统中,exachk进程占用了大量CPU资源. 了解之前的变更,只是巡检之前升级了AHF,然后进行标准的exachk巡检. 现象: 目前机器整体 ...

  10. .NET Core开发实战(第24课:文件提供程序:让你可以将文件放在任何地方)--学习笔记

    24 | 文件提供程序:让你可以将文件放在任何地方 文件提供程序核心类型: 1.IFileProvider 2.IFileInfo 3.IDirectoryContents IFileProvider ...