在 ABP 中,EFCore 上下文类需要继承AbpDbContext<T>,整体编写方法跟继承DbContext<T>一致 ,接下来我们将一步步来讲解在AbpBase中如何添加 EFCore 功能。
ABP 中,可以在上下文类加上一个ConnectionStringName特性,然后在配置服务时,ABP 会自动为其配置连接字符串。
[ConnectionStringName("Default")]public partial class DatabaseContext : AbpDbContext<DatabaseContext>
Default是一个标识,你也可以填写其他字符串标识。
首先,我们在AbpBase.Database模块中,创建两个文件夹:
BaseDataExtensionData
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>#endregionpublic AbpBaseDataContext(DbContextOptions<AbpBaseDataContext> options): base(options){}/// <summary>/// 定义映射/// </summary>/// <param name="modelBuilder"></param>protected override void OnModelCreating(ModelBuilder modelBuilder){#region 定义 映射#endregionOnModelCreatingPartial(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 里面有多种配置方式,例如 DbContext,读者可以到 Wiki 去学习Freesql:
https://*git*hu*b.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框架配置数据库的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持一聚教程网。