本篇内容主要讲解“怎么为ABP框架配置数据库”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么为ABP框架配置数据库”吧!

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

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

FreesqlFreeSql.Provider.SqliteFreeSql.Provider.SqlServerFreeSql.Provider.MySql创建标准的 EFCore 数据库上下文

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

连接字符串

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

[ConnectionStringName("Default")]publicpartialclassDatabaseContext:AbpDbContext<DatabaseContext>

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

定义隔离的上下文

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

BaseDataExtensionData

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

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

usingMicrosoft.EntityFrameworkCore;usingVolo.Abp.Data;usingVolo.Abp.EntityFrameworkCore;namespaceAbpBase.Database{///<summary>///上下文///<para>这部分用于定义和配置基础表的映射</para>///</summary>[ConnectionStringName("Default")]publicpartialclassAbpBaseDataContext:AbpDbContext<AbpBaseDataContext>{#region定义DbSet<T>#endregionpublicAbpBaseDataContext(DbContextOptions<AbpBaseDataContext>options):base(options){}///<summary>///定义映射///</summary>///<paramname="modelBuilder"></param>protectedoverridevoidOnModelCreating(ModelBuildermodelBuilder){#region定义映射#endregionOnModelCreatingPartial(modelBuilder);}partialvoidOnModelCreatingPartial(ModelBuildermodelBuilder);}}

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

usingMicrosoft.EntityFrameworkCore;namespaceAbpBase.Database{publicpartialclassAbpBaseDataContext{#region定义DbSet<T>#endregion///<summary>///定义映射///</summary>///<paramname="modelBuilder"></param>partialvoidOnModelCreatingPartial(ModelBuildermodelBuilder){}}}

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

多数据库支持和配置

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

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

namespaceAbpBase.Domain.Shared{publicenumAbpBaseDataType{Sqlite=0,Mysql=1,Sqlserver=2//其他数据库}}

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

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

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

context.Services.AddAbpDbContext<AbpBaseDataContext>();

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

配置上下文连接字符串

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

配置多数据库支持:

FreeSql.DataTypedataType=default;Configure<AbpDbContextOptions>(options=>{switch(WholeShared.DataType){caseAbpBaseDataType.Sqlite:options.UseSqlite<AbpBaseDataContext>();dataType=FreeSql.DataType.Sqlite;break;caseAbpBaseDataType.Mysql:options.UseMySQL<AbpBaseDataContext>();dataType=FreeSql.DataType.MySql;break;caseAbpBaseDataType.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类,其内容如下:

usingFreeSql.Internal;usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceAbpBase.Database{///<summary>///Freesql上下文///</summary>publicpartialclassFreesqlContext{publicstaticIFreeSqlFreeselInstance=>Freesql_Instance;privatestaticIFreeSqlFreesql_Instance;publicstaticvoidInit(stringconnectStr,FreeSql.DataTypedataType=FreeSql.DataType.Sqlite){Freesql_Instance=newFreeSql.FreeSqlBuilder().UseNameConvert(NameConvertType.PascalCaseToUnderscore).UseConnectionString(dataType,connectStr)//.UseAutoSyncStructure(true)//自动同步实体结构到数据库,生产环境禁止使用!.Build();OnModelCreating(Freesql_Instance);}privatestaticvoidOnModelCreating(IFreeSqlfreeSql){OnModelCreatingPartial(freeSql);}}}

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

usingFreeSql;usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceAbpBase.Database{publicpartialclassFreesqlContext{privatestaticvoidOnModelCreatingPartial(IFreeSqlfreeSql){varmodelBuilder=freeSql.CodeFirst;SyncStruct(modelBuilder);}///<summary>///同步结构到数据中///</summary>///<paramname="codeFirst"></param>privatestaticvoidSyncStruct(ICodeFirstcodeFirst){//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框架配置数据库”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!