ABP vNext使用多数据库为登陆授权模块分库

修改连接字符串

abp中默认所有模块都放在一个库中,配置一个连接字符串“Default”,如果有使用多数据库为模块分库需求可以按照官网文档进行操作,下面我简单总结下步骤:修改所有appsettings.json的连接字符串,增加你要分库模块的字符串,模块的连接字符串名可以去源码中相应模块找,比如identity模块AbpIdentityDbProperties.cs文件中。

如果这些库之前已经被别人创建完成那么在运行时使用已经足够,不用往下看了,如果是第一次分库,还需要执行迁移,生成数据库。

创建新的迁移项目

新建一个类库项目复制xxx.EntityFrameworkCore.DbMigrations.csproj的内容,这里面注意RootNamespace,我的是xxx所以都不用修改,把DbMigrations类库类库的EntityFrameworkCore文件夹复制过来,修改里面那四个类的名字以及相互间的引用,这是必须的否则后面引用时候会重名冲突,如果可以也直接复制DbMigrations类库,修改类库及其子类的名字

添加对DbMigrations项目的引用

从 .Host或.Web 项目中添加对该DbMigrations项目的引用.这一步看官网文档容易疏忽,但一定要执行,否则,EF Core Tool不允许使用Add-migration命令

修改DbMigrations项目的DbContext类

EntityFrameworkCore文件夹下的MigrationsDbContext文件修改OnModelCreating类是该迁移类库所要引用的模块,把不需要的删除留下需要的,比如下图我要给Identity和IdentityServer分库,所以原来的我删除这两个,新建的两个类库各配置一个,注意你新建的DbContext类名前要加上[ConnectionStringName(“AbpIdentityServer”)]属性,才能去识别你配置中的连接串!

修改DbMigrations项目的MigrationsDbContextFactory类

EF Tool使用这个类执行类似Add-MigrationUpdate-Database命令,需要指定CreateDbContext方法中该模块使用的数据库连接字符串。

执行迁移

打开包管理器控制台, 选择相应模块.EntityFrameworkCore.DbMigrations 项目为默认项目(确保.Host或.Web项目是启动项目),运行 Add-Migration "Initial 和 Update-Database 命令,执行后会生成新的数据库及其相应表。我的是mac设备所以需要使用dotnet ef migrations add语句

从主数据库中删除模块

新的数据库已经建立,这步就是生成主数据库新的迁移来移除表,但首先要先将要删除表的数据复制到新库中,如果是全新的项目建议删除所有数据库及Migrations文件夹,全部重新生成迁移文件。

实现新模块的自动化迁移

在DbMigrator项目中引用新建的.EntityFrameworkCore.DbMigrations 迁移类库,并且将 typeof(xxxDbMigrationsModule) 依赖项添加到 xxxDbMigratorModule 的依赖项列表中

执行自动化迁移

前面生成迁移脚本时已经将数据库及表初始化完毕(前面生成步骤不要省,直接运行这个我是报错了。。。),但是种子数据还没有插入到数据库,所以还是要执行一次这个迁移项目。

遇到的坑

执行迁移过程中,一直不能update-database,因为我的数据库是阿里云的mysql,需要配置白名单,我之前一个库的时候配置过,在本地用过,是好用的,我家里宽带没有固定ip,这次分库过程我把新的公网IP配置上也连不上(后来我在想是不是当时我没有等一分钟,以为阿里白名单配置延迟一分钟),然后我按照阿里帮助建立了网关,并在本地安装网关客户端,然后就正常了!

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注