当前位置: 代码网 > it编程>编程语言>Asp.net > 为ABP框架配置数据库

为ABP框架配置数据库

2024年05月18日 Asp.net 我要评论
在abpbase.database中,通过 nuget 添加以下几个库:版本都是 1.9.0-preview0917,你可以使用最新版本的。freesqlfreesql.provider.sqlite

在 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)

相关文章:

  • ASP.NET MVC模式简介

    一、mvc模式简介mvc模式是一种流行的web应用架构技术,它被命名为模型-视图-控制器(model-view-controller)。在分离应用程序内部的关注点方面,mvc是一种…

    2024年05月18日 编程语言
  • ASP.NET Core中的Razor页面使用视图组件

    视图组件简介在新的asp.net core mvc中,视图组件类似于局部视图,但它们更强大。视图组件不使用模型绑定,仅依赖于您在调用时提供的数据。视图组件特性:呈现页面响应的某一部…

    2024年05月18日 编程语言
  • ASP.NET MVC模式中应用程序结构详解

    在文章中,讲解了一些mvc的概念,并且创建了第一个asp.net mvc项目,这篇文章将讲解asp.net mvc程序中的代码解构,新创建的mvc应用程序解构如下图所示:一、app…

    2024年05月18日 编程语言
  • .net core利用PdfSharpCore操作PDF实例教程

    前序使用pdfsharpcore请注意使用xgraphics基类,与system.drawing 的graphics类似,xgraphics 提供xcolor(颜色)、xpen(画…

    2024年05月18日 编程语言
  • ASP.NET MVC项目部署方式介绍

    asp.net mvc编写的程序需要部署到iis上面才能进行访问,部署方式分为两种。一、直接用源代码部署第一种方式可以直接使用源代码进行部署。部署步骤:1、新建网站在iis里面选择…

    2024年05月18日 编程语言
  • 如何在.Net 7中将Query绑定到数组详解

    如何在.Net 7中将Query绑定到数组详解

    前言在 .net 7 中,我们可以通过绑定数组的方式来接收来自查询字符串的参数。这样就不需要再使用逗号分隔的字符串来获取参数了。代码演示假设我们需要从 quer... [阅读全文]

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com