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.SqlServerFluentMigrator.Runner.PostgresFluentMigrator.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() {
/*

最低0.47元/天 解锁文章
1999

被折叠的 条评论
为什么被折叠?



