ABP VNext + FluentMigrator:数据库迁移管理

ABP VNext + FluentMigrator:数据库迁移管理 🚀



1. 引言

✨ TL;DR

  • 使用 FluentMigrator 在 ABP VNext 项目中实现代码化、版本化的数据库架构变更 🏗️
  • 支持按环境(Development/Staging/Production)执行不同迁移脚本,确保环境一致性 🔄
  • 自动化迁移集成到 CI/CD 流程,保证应用的高可用与高一致性 🔧

📚 背景与动机

手动管理 SQL 脚本既容易出错,也难以维护,尤其在多环境部署和团队协作开发时。FluentMigrator 提供了基于 C# 的迁移 API,支持版本控制、回滚和预览功能,能将数据库迁移纳入代码管理,确保迁移的可重复性、可审计性和安全性。结合最新的 ABP VNext 9.x 框架和 .NET 8 LTS,我们可以构建高性能、高可用、可复现的数据库迁移体系。


2. 环境与依赖

🛠️ 平台版本

  • .NET 9
  • ABP VNext 9.x(模块化项目模板)

🔗 核心 NuGet 包

dotnet add package FluentMigrator.Runner --version 4.1.3
dotnet add package FluentMigrator.Runner.Extensions.ASPNETCore --version 4.1.3
dotnet add package Volo.Abp.EntityFrameworkCore --version 9.0.7
📦 附加包

根据数据库类型,可选:

  • FluentMigrator.Runner.SqlServer
  • FluentMigrator.Runner.Postgres
  • FluentMigrator.Runner.MySql

3. 初始配置 🛠️

3.1 安装 CLI 工具

dotnet tool install --global FluentMigrator.DotNet.Cli --version 4.1.3
dotnet tool restore

3.2 安装包与服务注册

在迁移模块 MyProject.DbMigration/MyDbMigrationModule.cs 中:

public override void ConfigureServices(ServiceConfigurationContext context)
{
   
   
    var configuration = context.Services.GetConfiguration();
    context.Services.AddFluentMigratorCore()
        .ConfigureRunner(rb => rb
            .AddSqlServer()  // 或 .AddPostgres(), .AddMySql()
            .WithGlobalConnectionString(configuration.GetConnectionString("Default"))
            .ScanIn(typeof(MyDbMigrationModule).Assembly).For.Migrations())
        .AddLogging(lb => lb
            .AddFluentMigratorConsole()
            .AddFile("Logs/migration.log"));
}

3.3 定义迁移目录结构

Migrations/
 ├─ 20250101_InitialCreate.cs
 ├─ 20250215_AddCustomerTable.cs
 └─ Environments/
     ├─ Development/
     │    └─ 20250301_SeedTestData.cs
     └─ Production/
          └─ 20250305_CreateReportingViews.cs

通过目录与命名空间区分环境迁移,便于批量执行或过滤。


4. 编写迁移类 ✍️

📄 基类与版本号

using FluentMigrator;

[Migration(20250215)]
public class AddCustomerTable : Migration
{
   
   
    public override void Up() =>
        Create.Table("Customer")
            .WithColumn("Id").AsGuid().PrimaryKey()
            .WithColumn("Name").AsString(200).NotNullable();

    public override void Down() =>
        Delete.Table("Customer");
}

🔑 环境变量注入示例

using FluentMigrator;
using Microsoft.Extensions.Configuration;

[Migration(20250301)]
public class SeedTestData : Migration
{
   
   
    private readonly string _env;
    public SeedTestData(IConfiguration config)
    {
   
   
        _env = config["ASPNETCORE_ENVIRONMENT"];
    }

    public override void Up()
    {
   
   
        if (_env == "Development")
        {
   
   
            Execute.EmbeddedScript("Migrations.Environments.Development.SeedTestData.sql");
        }
    }

    public override void Down() {
   
    /*
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kookoos

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值