ABP EF Core多数据库支持
ABP官方Demo中提供了在EF Core中如何实现多数据库支持的例子,但Demo说明文档中对于要做哪些修改没做说明,所以本文在此做下说明。
首先要说明的是(我这边通过官方模板生成时输入的项目名称为TaobaoAuthorization
),除了ConnectionStringName
声明是在TaobaoAuthorizationConsts
中外,所有修改均在TaobaoAuthorization.EntityFrameworkCore
项目中。
为了支持多数据库,你需要做以下调整
- 将
DbContextOptionsConfigurer
的Configure
方法修改为泛型方法,这样你就不需要像官方Demo那样实现两个DbContextOptionsConfigurer
public static class DbContextOptionsConfigurer{public static void Configure<T>(DbContextOptionsBuilder<T> dbContextOptions,string connectionString)where T : AbpDbContext{/* This is the single point to configure DbContextOptions for TaobaoAuthorizationDbContext *///dbContextOptions.UseSqlServer(connectionString);dbContextOptions.UseMySql(connectionString);}public static void Configure<T>(DbContextOptionsBuilder<T> dbContextOptions,DbConnection connection)where T : AbpDbContext{/* This is the single point to configure DbContextOptions for TaobaoAuthorizationDbContext *///dbContextOptions.UseSqlServer(connectionString);dbContextOptions.UseMySql(connection);}}
- 增加其它数据库对应的
DbContext
,这里除了默认的TaobaoAuthorizationDbContext
外,我们再新增了TaobaoAuthorizedDbContext
- 调整并新增其他数据库对应的
DbContextFactory
,这里还是提取了一个抽象类出来
/// <summary>/// EF Core PMC commands 基类/// </summary>/// <typeparam name="T"></typeparam>public abstract class DbContextFactory<T> : IDesignTimeDbContextFactory<T>where T : AbpDbContext{/// <summary>/// 要采用的数据库连接节点名称/// </summary>public abstract string ConnectionStringName { get; }/// <summary>/// 创建DbContext实例/// 如果觉得每个数据库都要自己new太low,那么可以采用反射来动态创建,毕竟这里也只是PMC command使用的/// </summary>/// <param name="options"></param>/// <returns></returns>public abstract T CreateDbContext(DbContextOptions<T> options);public T CreateDbContext(string[] args){var builder = new DbContextOptionsBuilder<T>();var configuration = AppConfigurations.Get(WebContentDirectoryFinder.CalculateContentRootFolder());DbContextOptionsConfigurer.Configure(builder,configuration.GetConnectionString(ConnectionStringName));return this.CreateDbContext(builder.Options);}}
然后将原先官网生成的相应DbContextFactory
进行调整,如果还有其它数据库也只要继承DbContextFactory<T>
即可
/* This class is needed to run EF Core PMC commands. Not used anywhere else */public class TaobaoAuthorizationDbContextFactory : DbContextFactory<TaobaoAuthorizationDbContext>{//第一个数据库配置public override string ConnectionStringName => TaobaoAuthorizationConsts.DefaultConnectionStringName;public override TaobaoAuthorizationDbContext CreateDbContext(DbContextOptions<TaobaoAuthorizationDbContext> options){return new TaobaoAuthorizationDbContext(options);}}public class TaobaoAuthorizedDbContextFactory : DbContextFactory<TaobaoAuthorizedDbContext>{//第二个数据库配置public override string ConnectionStringName => TaobaoAuthorizationConsts.AuthorizedConnectionStringName;public override TaobaoAuthorizedDbContext CreateDbContext(DbContextOptions<TaobaoAuthorizedDbContext> options){return new TaobaoAuthorizedDbContext(options);}}
- 增加
MyConnectionStringResolver
,ABP如何分辨应该用哪个数据库连接就是在这里定义的,当然这里还是在官网Demo的基础上略作调整,实际可以考虑增加Dictionary<Type,string>
来实现DbContext
与配置中ConnectionStringName
的映射关系
public class MyConnectionStringResolver : DefaultConnectionStringResolver{public MyConnectionStringResolver(IAbpStartupConfiguration configuration): base(configuration){}public override string GetNameOrConnectionString(ConnectionStringResolveArgs args){var connectStringName = this.GetConnectionStringName(args);if (connectStringName != null){var configuration = AppConfigurations.Get(WebContentDirectoryFinder.CalculateContentRootFolder());return configuration.GetConnectionString(connectStringName);}return base.GetNameOrConnectionString(args);}private string GetConnectionStringName(ConnectionStringResolveArgs args){var type = args["DbContextConcreteType"] as Type;if (type == typeof(TaobaoAuthorizedDbContext)){return TaobaoAuthorizationConsts.AuthorizedConnectionStringName;//返回数据库二的节点名称}return null;//采用默认数据库}}
- 调整模板生成的
EntityFrameworkCoreModule
,增加PreInitialize
实现,注意需要添加引用using Abp.Configuration.Startup
,如果你还有其它数据库连接,那么也只要再依样新增AddDbContext
即可
public override void PreInitialize(){base.PreInitialize();Configuration.ReplaceService<IConnectionStringResolver, MyConnectionStringResolver>();this.AddDbContext<TaobaoAuthorizationDbContext>();//数据库一this.AddDbContext<TaobaoAuthorizedDbContext>();//数据库二}private void AddDbContext<TDbContext>()where TDbContext: AbpDbContext{Configuration.Modules.AbpEfCore().AddDbContext<TDbContext>(options =>{if (options.ExistingConnection != null){DbContextOptionsConfigurer.Configure(options.DbContextOptions, options.ExistingConnection);}else{DbContextOptionsConfigurer.Configure(options.DbContextOptions, options.ConnectionString);}});}
至此你就已经完成了ABP多数据库支持的代码调整工作,上述代码均可在这里找到。
ABP EF Core多数据库支持相关推荐
- .net core发布 正在发现数据上下文_使用EF Core实现数据库读写分离
以下文章来源于朝夕Net社区 ,作者Eleven 朝夕Net社区 朝气.丰富.活跃的.Net社区,朝夕教育携百万粉丝共同打造!有技术,有感悟,有新闻,有照片,有故事,还有梦想! [精选转载]| 作者/ ...
- EF core和数据库, Database First
加载Entity Framework Core 需要的Package 包s 两类包 * 一类是EF core 资深的,Design,Tools * 另一类是,对应数据库的 包,如mysql, SqlS ...
- 在.NET Core类库中使用EF Core迁移数据库到SQL Server
前言 如果大家刚使用EntityFramework Core作为ORM框架的话,想必都会遇到数据库迁移的一些问题. 起初我是在ASP.NET Core的Web项目中进行的,但后来发现放在此处并不是很合 ...
- .Net Core建站(1):EF Core+CodeFirst数据库生成
emmm,本来想着用Core做一个小项目玩玩的,然后肯定是要用到数据库的, 然后想,啊,要不用CodeFirst,感觉很腻害的样子,于是,一脸天真无邪的我就踏入了一个深不见底的天坑... 本来想着,应 ...
- EF Core 生成数据库
1.运行cmd,切换到打开项目所在文件夹,输入下面的命令 dotnet ef migrations add Initial 建立并初始化数据库 dotnet ef database update ...
- .Net Core建站(2):EF Core+CodeFirst数据库迁移
上一篇的话,说了下怎么使用EF7 实现 CodeFirst去生成数据库, 其实还有好多问题的,这次一点一点的解决吧,都挺简单,不过零零散散的,, 1.读取配置文件,获得链接字符串 2.使用数据库进行增 ...
- EF Core数据库Provider一览
当EF Core 1.x系列和2.0版本之间经过重大的重写时,所有EF Core数据库Provider都受到重创.从那时起,各种私人和商业开发团队一直在努力填补这个空白. 正文 当EF Core 1. ...
- ABP Vnext 4.4:统一Ef Core的DbContext/移除EF Core Migrations项目
Abp vnext 4.4出现了一个比较重大的变更:在Startup template中移除了EF Core Migrations项目,本文翻译自community.abp.io/articl 由于本 ...
- EF Core 数据库 Provider 一览
当 EF Core 1.x 系列和 2.0 版本之间经过重大的重写时,所有 EF Core 数据库 Provider 都受到重创.从那时起,各种私人和商业开发团队一直在努力填补这个空白. 正文 当 E ...
最新文章
- 罗永浩“咬定”微信不放松
- 第九届全国大学生智能汽车竞赛获奖名单
- 用tensorflow还原PSENet网络
- 25组新鲜出炉的有用图标集
- 在一台电脑上运行两个或多个tomcat
- mysql5 varchar_MYSQL 5.7 VARCHAR 类型实验
- MySQL命令(二)| 表的增删查改、聚合函数(复合函数)、联合查询
- case when then的用法
- 使用 Azure Site Recovery 灾难恢复至 Azure 的功能现已正式发布
- android里面的广播,Android里面的各种广播
- unity 打开项目路径无效_unity3d建立的文件有中文路径,现在新建了项目打不开了...
- HTML炫酷粒子源代码
- 天枢系统 | 白条账单架构及618备战
- 笔记本计算机怎么进入安全模式启动,笔记本怎么进入安全模式,详细教您联想笔记本怎么进入安全模式...
- 在电脑上收听广播——龙卷风网络收音机试用
- Unity Timeline自定义轨道 DefaultPlayables源码剖析
- UVC 摄像头驱动(二)描述符分析
- Writeup-GKCTF-Misc题:Harley Quinn
- 计算机教师道德模范事迹材料,优秀道德模范教师先进事迹材料
- 基于OpenStack的云测试平台
热门文章
- C++怎样获取当前系统时间?
- 2022云南省职业院校技能大赛(高职组) Web技术(网站设计与开发)赛项规程
- 为什么建议大家使用 Linux 开发?爽(外加七个感叹号)
- OSChina 周三乱弹 ——纪念Bob Taylor
- webRTC(十):webrtc 实现web端对端视频
- 编c语言程序 任意输入一个长方体的长,宽,高,计算体积.,C语言程序,由键盘任意输入一个长方体的长.宽.高,计算体积....
- 2019 CCF-CCSP-苏州之旅
- prescan安装包(8.5/2019.2版本)下载
- ¥符号在安卓上显示只有一个横杠的问题
- php如何实现发送qq邮箱验证,php在windows下发送邮件实现