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