首页 > 其他分享 >Abp搭建多模块,子模块迁移问题

Abp搭建多模块,子模块迁移问题

时间:2023-02-23 13:48:42浏览次数:53  
标签:文件夹 Abp 添加 模块 MyModule MyModuleMigrationsDbContext options 搭建

Abp搭建多模块,子模块迁移问题

第一步,在官网Abp.io下载在一个全新的框架,然后可以根据快速入门来实现属于自己的第一套ABP增删改查.

快速入门官网网址:https://docs.abp.io/zh-Hans/abp/latest/Tutorials/Todo/Index

流程:第一步创建一个全新的空文件夹,通过cmd的方式来打开控制面板,输入以下命令,确保自己有abp.cli

 dotnet tool install -g Volo.Abp.Cli

如果已经有的话,就输入命令下载新框架:

abp new TodoApp

进入框架,点击TodoApp.DbMigrator设为启动项目,在appsettings.json文件中修改连接字符串为自己本地的或者是需要连接的,然后F5初始化,这个过程会在本地数据中创建一个数据库并且生成初始化的数据表.

此步骤完成之后,在右击TodoApp.Web,设为启动项目,将此程序中的appsettings.json文件的连接字符串改成和TodoApp.DbMigrator一样.到目前为止,主框架的基本设置就已经完成.

然后需要的是给主模块添加自己的数据表.

可以根据快速入门流程走.

在以上流程都成功的基础上,就可以进行子模块的添加了.

第一步:脚手架生成新的子框架,运行以下命令之后,会生成一个名为modules 的文件夹,在文件夹里会有一个MyModule的解决方案,之后如果还想添加新的解决方案,只需要把MyModule名字修改,执行命令,就会出现新的解决方案.

abp add-module MyModule --new --add-to-solution-file

文件夹生成之后,点击自身的项目进行重载,可以把自己加入的子框架都加载出来,

然后需要做的就是给自己的子模块创建新的数据库和实体.

在子模块中的Domain层中添加一个属于自己模块的文件夹(这个文件夹至关重要,之后的文件夹都要是一样的),在继承的时候可以根据自己的需求继承父类,来决定带不带审计字段.创建完成之后在子模块的EntityFrameworkCore 项目中的 MyModuleDbContext.cs 文件,添加相应的 DbSet,然后在 MyModuleDbContextModelCreatingExtensions.cs 中添加模型映射

builder.Entity<role>(b =>
        {
            b.ToTable("role");//不带前缀
            b.Property(t => t.RoleName).IsRequired().HasMaxLength(100);

        });

以上步骤都完成之后,就可以在主模块中进行数据迁移了.

准备步骤(重点)

如何为模块添加一个单独的数据库并实现数据库迁移。

首先在 MainApp.EntityFrameworkCore 项目中添加目录 EntityFrameworkCore\MyModule。在这个目录中创建一个名为 MyModuleMigrationsDbContext.cs 的文件。内容如下:

public class MyModuleMigrationsDbContext : AbpDbContext<MyModuleMigrationsDbContext>

    {
        public MyModuleMigrationsDbContext(DbContextOptions<MyModuleMigrationsDbContext> options) : base(options)
        {
        }
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);
            modelBuilder.ConfigureMyModule();
        }
    }

然后添加一个名为 MyModuleMigrationsDbContextFactory.cs 的文件:

public class MyModuleMigrationsDbContextFactory : IDesignTimeDbContextFactory<MyModuleMigrationsDbContext>
    {
        public MyModuleMigrationsDbContext CreateDbContext(string[] args)
        {
            var configuration = BuildConfiguration();
            var builder = new DbContextOptionsBuilder<MyModuleMigrationsDbContext>()
            //这里的MyModule是根据自己的子项目MyModuleDbContext中的[ConnectionStringName(ForRbacDbProperties.ConnectionStringName)]中的ConnectionStringName,F12查看上文,中的public const string ConnectionStringName = "Rbac";引号中的字符串来决定的,切记要一致,不然会出错.导致运行的时候主模块和子模块分不清楚
                .UseSqlServer(configuration.GetConnectionString("MyModule"));
            return new MyModuleMigrationsDbContext(builder.Options);
        }
        private static IConfigurationRoot BuildConfiguration()
        {
            var builder = new ConfigurationBuilder()
                .SetBasePath(Path.Combine(Directory.GetCurrentDirectory(), "../MainApp.DbMigrator/"))
                .AddJsonFile("appsettings.json", optional: false);
            return builder.Build();
        }
    }

这两个文件与 MainApp 的 DbContext 内容是类似的,大家可以比较一下。因为模块也要从 appsettings.json 中读取数据库配置,因此我们需要修改 appsettings.json 中的数据库链接字符串,注意需要修改两个位置:一个是 MainApp.DbMigrator 项目中的,另一个是 MainApp.HttpApi.Host 项目中的。仿照 MainApp 的连接字符串添加一个名为 MyModule 的即可。这样模块就可以有一个单独的数据库了。

一切准备就绪之后,运行迁移命令

add-migration -context MyModuleMigrationsDbContext -output Migrations/MyModule
Update-database  -context MyModuleMigrationsDbContext

迁移成功的话,就可以查看数据库,看看有没有新增自己的数据库.如果生成就说明成功.失败就根据报错解决问题.

其他设置

因为是不同的模块,所以要在主模块中集成一下其他的模块才能正确的在Swagger上面显示自己的方法.

在主模块中的TodoApp.Web文件中的TodoAppWebModule文件中添加如下

private void ConfigureAutoApiControllers()
{
    Configure<AbpAspNetCoreMvcOptions>(options =>
    {
        options.ConventionalControllers.Create(typeof(TodoAppApplicationModule).Assembly);
        //ForRbacApplicationModule可以在自己的子模块中的应用层中找到
        options.ConventionalControllers.Create(typeof(ForRbacApplicationModule).Assembly);
    });
}

集成成功之后,就可以在正确显示自己的方法了.

接口写完之后报500,代理问题的话需要在子模块ForRbac.EntityFrameworkCore中的ForRbacEntityFrameworkCoreModule文件添加一条

    context.Services.AddAbpDbContext<ForRbacDbContext>(options =>
    {
        options.AddDefaultRepositories(includeAllEntities: true);
    });

这样500就解决了

在子模块中创建的文件夹都需要一样,创建的文件后缀也是需要一样的

标签:文件夹,Abp,添加,模块,MyModule,MyModuleMigrationsDbContext,options,搭建
From: https://www.cnblogs.com/Zhuo-Hu/p/17147630.html

相关文章

  • 搭建nightngale监控体系
    nightngale,即夜莺,是由滴滴开源的监控系统,github地址为https://github.com/ccfos/nightingale。nightngale有一套很方便的监控告警系统可供使用,本身也有多项监控指......
  • 电源模块DCDC 电源合理应用之输入保险丝要求 BOSHIDA
            保险丝应安装在各并联模块的输入端,以防某一-模块出现输入短路故障,将输入母线短路。在出故障模块的输入保险丝熔断所需时间内,其余模块的输入电压将出......
  • BOSHIDA 三河博电科技 AC/DC专业电源模块 主要原理与应用
    BOSHIDA博电科技AC/DC专业电源模块主要原理与应用 AC/DC变换是将交流变换为直流,其功率流向可以是双向的,功率流由电源流向负载的称为“整流”,功率流由负载返回电源的......
  • php-wamp+eclipse+php环境搭建
    1.回顾:上篇已经解决了wamp与IIS冲突的问题2.这篇就开始使用wamp+eclipse搭建php的开发环境3.准备篇  3.1下载wamp软件      在百度里可以搜索到,安装的......
  • Rust开发环境搭建(Linux)
    1、使用Rustup安装       执行如下命令curl--proto'=https'--tlsv1.2-sSfhttps://sh.rustup.rs|sh       执行结果如下:        在这里使用......
  • vs2022 快速搭建imgui工程
    vcpkginstallimgui[dx11-binding]:x64-windows-staticvcpkginstallimgui[win32-binding]:x64-windows-static新建console工程点击查看代码//d3d11.lib;d3dc......
  • 手动搭建桥接网络 2
    1.建namespace和默认空间联通#veth1在ns1上,IP:192.168.1.11#veth0从默认空间->br0,IP:192.168.1.10ipnetnsaddns1iplinkaddveth0typevethpeernamevet......
  • 【1】性能测试导学--搭建环境
                            python版本需在3.8以下,需要重新安装python,在pycharm搜索安装locustio      ......
  • myql搭建mha高可用
    myql搭建mha高可用:注:本质是主从+高可用保障(1个mha管理节点,1个mysql主节点,1个mysql从节点)下载网址:​​https://code.google.com/archive/p/mysql-master-ha/downloads​​......
  • Node.js 环境搭建教程
    Node.js环境搭建教程文章目录​​Node.js环境搭建教程​​​​一、下载与安装​​​​1、下载​​​​2、安装​​​​第一步:点击“next”​​​​第二步:勾选“Iaccept.......