怎么为ABP框架配置数据库
本篇内容主要讲解“怎么为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));}}}
然后在AbpBaseDatabaseModule
的ConfigureServices
函数中添加注入服务:
FreesqlContext.Init(connectString,dataType);context.Services.AddSingleton(typeof(IFreeSql),FreesqlContext.FreeselInstance);context.Services.AddTransient(typeof(FreesqlContext),typeof(FreesqlContext));
通过以上步骤,我们的 ABP 就可以支持多数据库了,EFCore + Freesql,并且将将表分级隔离维护。
到此,相信大家对“怎么为ABP框架配置数据库”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。