首页 > 数据库 >如何使用 abp 创建 module 并应用单独的数据库迁移

如何使用 abp 创建 module 并应用单独的数据库迁移

时间:2024-04-19 14:11:06浏览次数:24  
标签:MyModuleMigrationsDbContext 数据库 module abp 添加 模块 MainApp

创建 abp 项目

官方文档已经提供了非常详细的新建项目向导。参考:https://docs.abp.io/en/abp/latest/Getting-Started-Create-Solution?UI=Blazor&DB=EF&Tiered=Yes

CLI 命令参考:https://docs.abp.io/en/abp/latest/CLI

我们使用 abp CLI 创建一个新项目。我使用 Blazor 来开发前端页面,正好学一下。

abp new MainApp -u blazor

然后按照官方文档操作即可:https://docs.abp.io/en/abp/latest/Getting-Started-Running-Solution?UI=Blazor&DB=EF&Tiered=Yes

主要步骤是:

  • 修改数据库连接字符串

  • 运行 .DbMigrator 项目初始化数据库并填充初始数据。

  • 运行 .HttpApi.Host  项目

如果操作正确,我们应该能够看到 Swagger 文档了。

如果同时启动 .HttpApi.Host 和 .Blazor 项目,前端页面也应该可以正常展示。基本的用户登录、角色权限都有了。

创建一个新模块

刚开始我是用 CLI 创建了一个新模块,然后手动把两个项目的 solution 文件集成到一块,麻烦而且易出错。后来发现原来 CLI 已经提供了将新模块添加到现有解决方案的命令,可参考:https://docs.abp.io/en/abp/latest/CLI#options-3

可以使用以下的命令:

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

注意运行该命令的时候要在 MainApp 的目录下。这样 CLI 会在当前目录下创建一个 modules 目录来存放新模块的解决方案,同时把所有项目添加到 MainApp 的解决方案中,还会修改一些文件,这样我们就不用手动集成模块了。

添加新 Model

接下来继续按照官方文档来添加新的 Model:https://docs.abp.io/en/abp/latest/Tutorials/Part-1

具体内容这里就不展开了,可根据实际需要添加几个 Model。

步骤大概是:

  • 添加 Model

  • 更新模块 MyModule.EntityFrameworkCore 项目中的 MyModuleDbContext.cs 文件,添加相应的 DbSet

  • 在 MyModuleDbContextModelCreatingExtensions.cs 中添加模型映射

为模块准备数据库迁移

接下来就是本文的重点,如何为模块添加一个单独的数据库并实现数据库迁移。

首先在 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>()
                .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 的即可。这样模块就可以有一个单独的数据库了。

运行模块数据库迁移

创建了新的 Model 后,我们要对数据进行迁移,以应用这些更改。

将 terminal 导航到 MainApp.EntityFrameworkCore 目录,运行以下命令:

dotnet ef migrations add migrationName --context MyModuleMigrationsDbContext --output-dir Migrations/MyModule

注意要指定要迁移的 DbContext,也就是 MyModuleMigrationsDbContext。同时我们还将迁移文件放在 Migrations/MyModule 目录下,这样不会与 MainApp 的迁移文件混淆。

如果一切正常,我们就可以在指定目录下看到生成的迁移文件了。

运行以下命令以应用数据库迁移:

dotnet ef database update --context MyModuleMigrationsDbContext

这样模块的数据库迁移就完成了。

其他设置

接下来按照官方文档继续添加相应的 AppService 及其接口等。这样我们的模块已经与 MainApp 是隔离的了,包括 Blazor 页面也是在一个单独的项目里。

如果运行 .HttpApi.Host 没有看到模块的 API,可以检查下 MainApp.HttpApi.Host 项目中的 MainAppHttpApiHostModule.cs 文件,看是否配置正确:

private void ConfigureConventionalControllers()
    {
        Configure<AbpAspNetCoreMvcOptions>(options =>
        {
            options.ConventionalControllers.Create(typeof(MainAppApplicationModule).Assembly);
            // Add the below line
            options.ConventionalControllers.Create(typeof(MyModuleApplicationModule).Assembly);
        });
    }

再次运行 .HttpApi.Host 和 .Blazor 项目,可以看到前端页面已经添加了一个新模块的链接,只是内容页是空的。接下来我们就可以在 MyModule 解决方案里的 Blazor 项目中开发前端页面了。

在添加 Model 后我还遇到过一个错误,如下图所示:

 

Autofact.Core.DependencyResolutionException: 'An exception was thrown while activating Volo.Abp.IdentityServer.Grants.PersistedGrantStore ....'

乍一看还以为是 IdentityServer 的问题,其实不是。展开看 inner exception 就会发现这个是我们添加的 Dto 的 mapping 导致的。因为 Entity 是有 Id 的,但 CreateUpdateProductDto 没有Id,所以 mapping 出错了。如果遇到这种情况,可以将 Id 省略掉:

CreateMap<CreateUpdateProductDto, Product>().Ignore(x => x.Id);
 

学习了几天感觉这个框架还是挺方便的,功能非常强大,但学习起来还是有一定难度的。框架各部分之间的依赖非常多,如果不仔细研究,很容易处处碰壁。好在官方文档写的还是相对比较详细的,只是部分文档还有空缺。希望官方以后补足吧。是否使用框架开发是一个两难的问题,太依赖框架可能会失去对细节的把控,处处受制于框架的实现;不使用框架就得自己重复造轮子。只能见仁见智了。

标签:MyModuleMigrationsDbContext,数据库,module,abp,添加,模块,MainApp
From: https://www.cnblogs.com/lhhb/p/18145784

相关文章

  • Qt6 连接 MySql数据库
    前言教程参考:http://t.csdnimg.cn/wKAk3Qt6是没有mysql驱动是要自己安装的,而且在Qt6是没有.pro文件,只能用cmake进行编译,特别的坑。我也是被坑惨了,还去傻乎乎地找.por文件,整了半天。必看这个教程是针对Qt6的,如果用的是Qt5,则不适用!在连接前要先安装Mysql,可以参考http://t......
  • 【面试准备】【SQL】数据库有哪些约束?
    数据库中的约束(constraints)是用来确保数据库中数据的准确性和可靠性的一种规则。以下是一些常见的数据库约束:PRIMARYKEY(主键):确保列的值是唯一的,并且不能为NULL。FOREIGNKEY(外键):用于在两个表之间建立链接,并确保引用的数据的完整性。UNIQUE(唯一):确保所有列的组合在表中是......
  • 数据库设计的必备小技巧
    前言对于后端开发人员来说,访问数据库,是代码中必不可少的一个环节。系统中收集到用户的核心数据,为了安全性,我们一般会存储到数据库,比如:mysql,oracle等。后端开发的日常工作,需要不断的建库和建表,来满足业务需求。这里就跟大家分享一下数据库设计的一些小技巧!见名知意在数据库设......
  • DbMigrator迁移数据库报错:The ConnectionString property has not been initialized.
    问题执行.DbMigrator时报错:TheConnectionStringpropertyhasnotbeeninitialized.原因情况一DbContext中没有指定连接字符串解决方案情况二appsettings.json配置文件的属性没有设置为始终复制解决方案右键appsettings.json选择属性>复制到输出目录选择始终复制或......
  • 如何实现数据库数据到Abp vnext实体对象的同步?以及代码生成工具
    在采用了EFCore的CodeFirst方式下,如果你在数据库中直接添加了新表或存储过程,你需要在项目代码中手动反向工程这些数据库的更改,以保持CodeFirst的代码与数据库同步。这种情况可以通过如下两个步骤来实现:从现有数据库创建模型:使用EntityFrameworkCore的Scaffold-DbContext......
  • JDBC数据库汇总Attack研究
    前言针对除Mysql的其它数据库的jdbcattack分析H2RCE介绍H2是一个用Java开发的嵌入式数据库,它本身只是一个类库,即只有一个jar文件,可以直接嵌入到应用项目中。H2主要有如下三个用途:第一个用途,也是最常使用的用途就在于可以同应用程序打包在一起发布,这样可以非常方便地......
  • 达梦数据库(DM8)安装
    达梦数据库(DM8)安装一、安装部署1.1下载本手册版本选择“DM8开发板”,CPU平台选择“X86”,操作系统选择“RedHat7”下载地址:https://www.dameng.com/DM8.html~]#wgethttps://download.dameng.com/eco/adapter/DM8/202401END/dm8_20240116_x86_rh7_64.zip1.2创建安装用户......
  • MSSQL 数据库服务器磁盘空间报警 -
    如服务器上有创建MSSQLReplication,则会自动创建distribution数据库,有时distribution数据库日志文件过大解决方案:1.第一种方案:查看日志大小, dbccsqlperf(logspace),查看哪个数据库日志文件过大,如果有数据库日志文件非常大,就需要通过检查日志的VLF使用情况来进行诊断,日志文件......
  • 数据库批量更新
    原文地址:https://www.cnblogs.com/exmyth/p/5757137.html mybatis实现批量更新 更新单条记录 1UPDATE course SET name = 'course1' WHERE id = 'id1';   更新多条记录的同一个字段为同一个值 1UPDATE course SET......
  • 构建RAG应用-day01: 词向量和向量数据库 文档预处理
    词向量和向量数据库词向量(Embeddings)是一种将非结构化数据,如单词、句子或者整个文档,转化为实数向量的技术。词向量搜索和关键词搜索的比较优势1:词向量可以语义搜索比如百度搜索,使用的是关键词搜索。而词向量搜索,是对句子的语义进行搜索,他会找到意思相近的前k个句子。优势2:词......