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

本文涉及的产品
云数据库 RDS SQL Server,基础系列 2核4GB
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 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,并且将将表分级隔离维护。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
6月前
|
关系型数据库 MySQL Java
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
【YashanDB知识库】原生mysql驱动配置连接崖山数据库
|
6月前
|
数据库
【YashanDB知识库】数据库一主一备部署及一主两备部署时,主备手动切换方法及自动切换配置
【YashanDB知识库】数据库一主一备部署及一主两备部署时,主备手动切换方法及自动切换配置
【YashanDB知识库】数据库一主一备部署及一主两备部署时,主备手动切换方法及自动切换配置
|
5月前
|
安全 Linux 网络安全
YashanDB数据库服务端SSL连接配置
YashanDB支持通过SSL连接确保数据传输安全,需在服务端生成根证书、服务器证书及DH文件,并将根证书提供给客户端以完成身份验证。服务端配置包括使用OpenSSL工具生成证书、设置SSL参数并重启数据库;客户端则需下载根证书并正确配置环境变量与`yasc_env.ini`文件。注意:启用SSL后,所有客户端必须持有根证书才能连接,且SSL与密码认证独立运行。
|
2月前
|
SQL XML Java
配置Spring框架以连接SQL Server数据库
最后,需要集成Spring配置到应用中,这通常在 `main`方法或者Spring Boot的应用配置类中通过加载XML配置或使用注解来实现。
228 0
|
5月前
|
Java 关系型数据库 MySQL
JDK、Tomcat、MariaDB数据库和Profile多环境的配置与使用
以上就是JDK、Tomcat、MariaDB数据库和Profile多环境的配置与使用的基本步骤。这些步骤可能会因为你的具体需求和环境而有所不同,但是基本的思路是一样的。希望这些信息能够帮助你更好地理解和使用这些工具。
179 17
|
10月前
|
存储 监控 安全
数据库多实例的部署与配置方法
【10月更文挑战第23天】数据库多实例的部署和配置需要综合考虑多个因素,包括硬件资源、软件设置、性能优化、安全保障等。通过合理的部署和配置,可以充分发挥多实例的优势,提高数据库系统的运行效率和可靠性。在实际操作中,要不断总结经验,根据实际情况进行调整和优化,以适应不断变化的业务需求。
|
6月前
|
SQL 关系型数据库 网络安全
Navicat Premium 17 最新版下载与配置:5分钟完成企业级数据库工具部署
Navicat Premium 17 是一款支持多种主流数据库(如 MySQL、Oracle、PostgreSQL 等)的多数据库管理工具,提供可视化数据建模、SQL 编辑和数据同步等功能。试用版提供 14 天全功能体验,商业版支持跨平台使用。安装环境要求 Windows 10/11 或 macOS 12.0+,最低配置为 4GB 内存。下载并解压安装包后,按步骤启动安装程序、接受许可协议、自定义安装路径并完成安装。首次运行时需激活许可证并配置数据库连接。常见问题包括无法写入注册表、试用期续费及连接数据库权限问题。高级功能涵盖 SSH 通道加速、自动化任务调度和性能调优建议。
1646 19
|
5月前
|
Oracle 关系型数据库 Linux
YashanDB异构数据库链接配置
本指南介绍在YashanDB中配置异构数据库链接(DBLINK)的方法,特别是连接至Oracle数据库的前置要求与步骤。需确保YashanDB服务端安装plugin插件包、Oracle Instant Client及libaio库,否则可能导致错误或进程崩溃。文档还提供了Oracle Instant Client和libaio库的具体安装指导,帮助管理员顺利完成配置。
|
7月前
|
数据库
【YashanDB 知识库】数据库一主一备部署及一主两备部署时,主备手动切换方法及自动切换配置
**数据库主备切换简介** 在数据库正常或异常情况下,实现主备切换至关重要。若配置不当,主节点故障将影响业务使用,尤其在23.2版本中。原因包括资源紧张或主节点异常。解决方法涵盖手动和自动切换: 1. **一主一备部署**: - **手动切换**:支持Switchover(同步正常时)和Failover(主库损坏时)。 - **自动切换**:启用yasom仲裁选主开关。 2. **一主两备部署**: - 默认最大保护模式,自动切换开启。 需检查并配置自动切换以确保高可用性。经验总结:一主一备默认关闭自动切换,需手动开启;一主两备默认开启。

热门文章

最新文章