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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS SQL Server,基础系列 2核4GB
简介: 浅入 ABP 系列(6):数据库配置

创建标准的 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,并且将将表分级隔离维护。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
25天前
|
存储 监控 安全
数据库多实例的部署与配置方法
【10月更文挑战第23天】数据库多实例的部署和配置需要综合考虑多个因素,包括硬件资源、软件设置、性能优化、安全保障等。通过合理的部署和配置,可以充分发挥多实例的优势,提高数据库系统的运行效率和可靠性。在实际操作中,要不断总结经验,根据实际情况进行调整和优化,以适应不断变化的业务需求。
|
18天前
|
消息中间件 资源调度 关系型数据库
如何在Flink on YARN环境中配置Debezium CDC 3.0,以实现实时捕获数据库变更事件并将其传输到Flink进行处理
本文介绍了如何在Flink on YARN环境中配置Debezium CDC 3.0,以实现实时捕获数据库变更事件并将其传输到Flink进行处理。主要内容包括安装Debezium、配置Kafka Connect、创建Flink任务以及启动任务的具体步骤,为构建实时数据管道提供了详细指导。
45 9
|
18天前
|
安全 Nacos 数据库
Nacos是一款流行的微服务注册与配置中心,但直接暴露在公网中可能导致非法访问和数据库篡改
Nacos是一款流行的微服务注册与配置中心,但直接暴露在公网中可能导致非法访问和数据库篡改。本文详细探讨了这一问题的原因及解决方案,包括限制公网访问、使用HTTPS、强化数据库安全、启用访问控制、监控和审计等步骤,帮助开发者确保服务的安全运行。
29 3
|
22天前
|
PHP 数据库 数据安全/隐私保护
布谷直播源码部署服务器关于数据库配置的详细说明
布谷直播系统源码搭建部署时数据库配置明细!
|
24天前
|
Java 数据库连接 数据库
如何构建高效稳定的Java数据库连接池,涵盖连接池配置、并发控制和异常处理等方面
本文介绍了如何构建高效稳定的Java数据库连接池,涵盖连接池配置、并发控制和异常处理等方面。通过合理配置初始连接数、最大连接数和空闲连接超时时间,确保系统性能和稳定性。文章还探讨了同步阻塞、异步回调和信号量等并发控制策略,并提供了异常处理的最佳实践。最后,给出了一个简单的连接池示例代码,并推荐使用成熟的连接池框架(如HikariCP、C3P0)以简化开发。
46 2
|
25天前
|
关系型数据库 MySQL Linux
在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。
本文介绍了在 CentOS 7 中通过编译源码方式安装 MySQL 数据库的详细步骤,包括准备工作、下载源码、编译安装、配置 MySQL 服务、登录设置等。同时,文章还对比了编译源码安装与使用 RPM 包安装的优缺点,帮助读者根据需求选择最合适的方法。通过具体案例,展示了编译源码安装的灵活性和定制性。
74 2
|
1月前
|
前端开发 Java 数据库连接
javamvc配置,增删改查,文件上传下载。
【10月更文挑战第4天】javamvc配置,增删改查,文件上传下载。
38 1
|
1月前
|
关系型数据库 MySQL Java
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
这篇文章是关于如何使用Django框架配置MySQL数据库,创建模型实例,并自动或手动创建数据库表,以及对这些表进行操作的详细教程。
66 0
Django学习二:配置mysql,创建model实例,自动创建数据库表,对mysql数据库表已经创建好的进行直接操作和实验。
|
1月前
|
应用服务中间件 数据库连接 网络安全
网站连接数据库配置错误
网站连接数据库配置错误
|
27天前
|
SQL 关系型数据库 数据库连接
"Nacos 2.1.0版本数据库配置写入难题破解攻略:一步步教你排查连接、权限和配置问题,重启服务轻松解决!"
【10月更文挑战第23天】在使用Nacos 2.1.0版本时,可能会遇到无法将配置信息写入数据库的问题。本文将引导你逐步解决这一问题,包括检查数据库连接、用户权限、Nacos配置文件,并提供示例代码和详细步骤。通过这些方法,你可以有效解决配置写入失败的问题。
53 0
下一篇
无影云桌面