为ABP框架配置数据库

目录
  • 创建标准的EFCore数据库上下文
    • 连接字符串
    • 定义隔离的上下文
    • 多数据库支持和配置
  • 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 去学习 Freesql

https://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));
        }
    }
}

然后在 AbpBaseDatabaseModule 的 ConfigureServices 函数中添加注入服务:

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

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

到此这篇关于为ABP框架配置数据库的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 为ABP框架添加基础集成服务

    目录 定义一个特性标记 全局统一消息格式 Http状态码 常用的请求结果 响应模型 全局异常拦截器 先说明一下 ApiResponseModel是抽象类 跨域请求 配置API服务 统一API模型验证消息 创建前 创建方式 创建后 补充:为什么需要统一格式 定义一个特性标记 这个标记用于标记一个枚举代表的信息. 在 AbpBase.Domain.Shared 项目,创建 Attributes目录,然后创建一个 SchemeNameAttribute 类,其内容如下: /// <summary>

  • 搭建基础结构的ABP解决方案介绍

    目录 搭建项目基础结构 AbpBase.Domain.Shared 创建过程 AbpBase.Domain 创建过程 AbpBase.Application.Contracts 创建过程 AbpBase.Database 创建过程 AbpBase.Application 创建过程 AbpBase.HttpApi 创建过程 AbpBase.Web 创建过程 关于ABP和代码解疑 模块 [DependsOn] 配置服务和管道 模块如何关联 搭建项目基础结构 打开 VS 2019,创建一个解决方案,然

  • 为ABP框架增加日志组件与依赖注入服务

    目录 自动依赖注入 添加日志依赖 添加日志功能 依赖注入 自动依赖注入 在 AbpBase.Web 的 AbpBaseWebModule 中,添加一个函数: 此函数用于扫描模块中的服务,自动将其加入容器中,这样就不需要收到加入了. /// <summary> /// 自动扫描所有的服务并进行依赖注入 /// </summary> /// <param name="context"></param> private void Configu

  • ABP框架中的事件总线功能介绍

    目录 事件总线 关于事件总线 为什么需要这个东西 事件总线创建过程 订阅事件 事件 发布事件 全局异常加入事件总线功能 创建事件 订阅事件 发布事件 测试 记录事件 事件总线 关于事件总线 ABP 中,为了方便进程间通讯,给开发者提供了一个叫 事件总线 的功能,事件总线分为 本地事件总线.分布式事件总线,本篇文章讲的是 本地事件总线,系列教程中暂时不考虑讲解 分布式事件总线. 事件总线 需要使用 Volo.Abp.EventBus 库,ABP 包中自带,不需要额外引入. 事件总线是通过 订阅-发

  • 为ABP框架配置数据库

    目录 创建标准的EFCore数据库上下文 连接字符串 定义隔离的上下文 多数据库支持和配置 Freesql配置服务 在 AbpBase.Database 中,通过 Nuget 添加以下几个库: 版本都是 1.9.0-preview0917,你可以使用最新版本的. Freesql FreeSql.Provider.Sqlite FreeSql.Provider.SqlServer FreeSql.Provider.MySql 创建标准的 EFCore 数据库上下文 在 ABP 中,EFCore 上

  • 详解ABP框架中的日志管理和设置管理的基本配置

    日志管理 Server side(服务器端) ASP.NET Boilerplate使用Castle Windsor's logging facility日志记录工具,并且可以使用不同的日志类库,比如:Log4Net, NLog, Serilog... 等等.对于所有的日志类库,Castle提供了一个通用的接口来实现,我们可以很方便的处理各种特殊的日志库,而且当业务需要的时候,很容易替换日志组件. 译者注释:Castle是什么:Castle是针对.NET平台的一个开源项目,从数据访问框架ORM到

  • ABP框架的基础配置及依赖注入讲解

    配置ABP 配置是通过在自己模块的PreInitialize方法中来实现的 代码示例如下: public class SimpleTaskSystemModule : AbpModule { public override void PreInitialize() { //在你的应用中添加语言包,这个是英语和作者的土耳其语. Configuration.Localization.Languages.Add(new LanguageInfo("en", "English&quo

  • 配置ABP框架使用对象映射

    目录 DTO和实体 实体 DTO 麻烦的映射 AutoMapper 集成 IObjectMapper/ObjectMapper 对象拓展 DTO和实体 实体 实体是领域驱动设计(Domain Driven Design)中的概念,实体通常一一映射某些对象的固有属性,最常使用的是关系型数据库中的表. 在 ABP 中,实体位于领域层中,实体类需要实现 IEntity<TKey> 接口或继承 Entity<TKey> 基类,示例如下: public class Book : Entity

  • flask框架配置mysql数据库操作详解

    本文实例讲述了flask框架配置mysql数据库操作.分享给大家供大家参考,具体如下: 该篇博客配置环境为:python版本3.5,flask2.0,python3中已经不再支持MySQLdb模块,所有这里我用了pymysql,所有使用前应该 安装pymysql: pip install pymysql 在网上的好多资料都给的是使用sqlite的例子,由于很不喜欢所以今天分享一下flask-sqlalchemy操作mysql的方法. 以前习惯使用sqlalchemy,后来发现使用flask-sq

  • Django框架配置mysql数据库实现过程

    django配置mysql数据库: 1.首先更改django项目文件中的settings.py的数据库配置 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'django_test', # 使用的数据库名, 'USER':'root', # 用户名 'PASSWORD':'123456', # 密码 'HOST':'localhost', # 数据库主机地址 'PORT':'3306' # 端口号

  • 基于ASP.NET MVC的ABP框架入门学习教程

    为什么使用ABP 我们近几年陆续开发了一些Web应用和桌面应用,需求或简单或复杂,实现或优雅或丑陋.一个基本的事实是:我们只是积累了一些经验或提高了对,NET的熟悉程度. 随着软件开发经验的不断增加,我们发现其实很多工作都是重复机械的,而且随着软件复杂度的不断提升,以往依靠经验来完成一些简单的增删改查的做法已经行不通了.特别是用户的要求越来越高,希望添加的功能越来多,目前这种开发模式,已经捉襟见肘.我很难想象如何在现有的模式下进行多系统的持续集成并添加一些新的特性. 开发一个系统时,我们不可避免

  • ABP框架中的日志功能完全解析

    ASP.NET Boilerplate使用Castle Windsor's logging facility日志记录工具,并且可以使用不同的日志类库,比如:Log4Net, NLog, Serilog... 等等.对于所有的日志类库,Castle提供了一个通用的接口来实现,我们可以很方便的处理各种特殊的日志库,而且当业务需要的时候,很容易替换日志组件. 译者注释:Castle是什么:Castle是针对.NET平台的一个开源项目,从数据访问框架ORM到IOC容器,再到WEB层的MVC框架.AOP,

  • ABP框架的体系结构及模块系统讲解

    DDD分层 为了减少复杂性和提高代码的可重用性,采用分层架构是一种被广泛接受的技术. 为了实现分层的体系结构,ABP遵循DDD(领域驱动设计)的原则,将分为四个层次: 展现层(Presentation):提供一个用户界面,实现用户交互操作. 应用层(Application):进行展现层与领域层之间的协调,协调业务对象来执行特定的应用程序的任务.它不包含业务逻辑. 领域层(Domain):包括业务对象和业务规则,这是应用程序的核心层. 基础设施层(Infrastructure):提供通用技术来支持

  • Spring MVC框架配置方法详解

    本文实例为大家分享了Spring MVC框架配置方法,供大家参考,具体内容如下 1.概述 Spring MVC 作用:用来实现前端浏览器与后面程序的交互 Spring MVC 是基于Spring 的MVC框架,所谓MVC(model,controller,view) ,整个Spring MVC 作用就是,基于Spring 将model(数据)在controller(后台程序) ,view(前端浏览器)之间交互 至于Spring MVC优点缺点,了解不深 不作评价, 2.引用的jar包 既然是基于

随机推荐