ABP官方Demo中提供了在EF Core中如何实现多数据库支持的例子,但Demo说明文档中对于要做哪些修改没做说明,所以本文在此做下说明。

首先要说明的是(我这边通过官方模板生成时输入的项目名称为TaobaoAuthorization),除了ConnectionStringName声明是在TaobaoAuthorizationConsts中外,所有修改均在TaobaoAuthorization.EntityFrameworkCore项目中。

为了支持多数据库,你需要做以下调整

  • DbContextOptionsConfigurerConfigure方法修改为泛型方法,这样你就不需要像官方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多数据库支持相关推荐

  1. .net core发布 正在发现数据上下文_使用EF Core实现数据库读写分离

    以下文章来源于朝夕Net社区 ,作者Eleven 朝夕Net社区 朝气.丰富.活跃的.Net社区,朝夕教育携百万粉丝共同打造!有技术,有感悟,有新闻,有照片,有故事,还有梦想! [精选转载]| 作者/ ...

  2. EF core和数据库, Database First

    加载Entity Framework Core 需要的Package 包s 两类包 * 一类是EF core 资深的,Design,Tools * 另一类是,对应数据库的 包,如mysql, SqlS ...

  3. 在.NET Core类库中使用EF Core迁移数据库到SQL Server

    前言 如果大家刚使用EntityFramework Core作为ORM框架的话,想必都会遇到数据库迁移的一些问题. 起初我是在ASP.NET Core的Web项目中进行的,但后来发现放在此处并不是很合 ...

  4. .Net Core建站(1):EF Core+CodeFirst数据库生成

    emmm,本来想着用Core做一个小项目玩玩的,然后肯定是要用到数据库的, 然后想,啊,要不用CodeFirst,感觉很腻害的样子,于是,一脸天真无邪的我就踏入了一个深不见底的天坑... 本来想着,应 ...

  5. EF Core 生成数据库

       1.运行cmd,切换到打开项目所在文件夹,输入下面的命令 dotnet ef migrations add Initial 建立并初始化数据库 dotnet ef database update ...

  6. .Net Core建站(2):EF Core+CodeFirst数据库迁移

    上一篇的话,说了下怎么使用EF7 实现 CodeFirst去生成数据库, 其实还有好多问题的,这次一点一点的解决吧,都挺简单,不过零零散散的,, 1.读取配置文件,获得链接字符串 2.使用数据库进行增 ...

  7. EF Core数据库Provider一览

    当EF Core 1.x系列和2.0版本之间经过重大的重写时,所有EF Core数据库Provider都受到重创.从那时起,各种私人和商业开发团队一直在努力填补这个空白. 正文 当EF Core 1. ...

  8. ABP Vnext 4.4:统一Ef Core的DbContext/移除EF Core Migrations项目

    Abp vnext 4.4出现了一个比较重大的变更:在Startup template中移除了EF Core Migrations项目,本文翻译自community.abp.io/articl 由于本 ...

  9. EF Core 数据库 Provider 一览

    当 EF Core 1.x 系列和 2.0 版本之间经过重大的重写时,所有 EF Core 数据库 Provider 都受到重创.从那时起,各种私人和商业开发团队一直在努力填补这个空白. 正文 当 E ...

最新文章

  1. 罗永浩“咬定”微信不放松
  2. 第九届全国大学生智能汽车竞赛获奖名单
  3. 用tensorflow还原PSENet网络
  4. 25组新鲜出炉的有用图标集
  5. 在一台电脑上运行两个或多个tomcat
  6. mysql5 varchar_MYSQL 5.7 VARCHAR 类型实验
  7. MySQL命令(二)| 表的增删查改、聚合函数(复合函数)、联合查询
  8. case when then的用法
  9. 使用 Azure Site Recovery 灾难恢复至 Azure 的功能现已正式发布
  10. android里面的广播,Android里面的各种广播
  11. unity 打开项目路径无效_unity3d建立的文件有中文路径,现在新建了项目打不开了...
  12. HTML炫酷粒子源代码
  13. 天枢系统 | 白条账单架构及618备战
  14. 笔记本计算机怎么进入安全模式启动,笔记本怎么进入安全模式,详细教您联想笔记本怎么进入安全模式...
  15. 在电脑上收听广播——龙卷风网络收音机试用
  16. Unity Timeline自定义轨道 DefaultPlayables源码剖析
  17. UVC 摄像头驱动(二)描述符分析
  18. Writeup-GKCTF-Misc题:Harley Quinn
  19. 计算机教师道德模范事迹材料,优秀道德模范教师先进事迹材料
  20. 基于OpenStack的云测试平台

热门文章

  1. C++怎样获取当前系统时间?
  2. 2022云南省职业院校技能大赛(高职组) Web技术(网站设计与开发)赛项规程
  3. 为什么建议大家使用 Linux 开发?爽(外加七个感叹号)
  4. OSChina 周三乱弹 ——纪念Bob Taylor
  5. webRTC(十):webrtc 实现web端对端视频
  6. 编c语言程序 任意输入一个长方体的长,宽,高,计算体积.,C语言程序,由键盘任意输入一个长方体的长.宽.高,计算体积....
  7. 2019 CCF-CCSP-苏州之旅
  8. prescan安装包(8.5/2019.2版本)下载
  9. ¥符号在安卓上显示只有一个横杠的问题
  10. php如何实现发送qq邮箱验证,php在windows下发送邮件实现