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

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就解决了
在子模块中创建的文件夹都需要一样,创建的文件后缀也是需要一样的
需要注意的一点是,在主模块集成其他子模块的时候,需要把子模块本身自带的Samples文件夹带文件都删掉,否则的话就会冲突

posted @   喜东东三三  阅读(122)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示