目录FluentMigrator传统数据库开发有哪些问题解决方案多数据库支持快速入门示例执行原生 SQL自动逆向迁移项目地址FluentMigrator推荐一个功能强大的 .NET 数据库迁移框架FluentMigrator 是一个用于 .NET 的迁移框架它允许您以结构化、版本控制的方式管理数据库架构变更。无需手动运行 SQL 脚本而是将迁移编写为可自动执行的 C# 类。传统数据库开发有哪些问题每个开发人员都需要手动运行 SQL 脚本数据库变更没有明确的版本控制。开发、测试和生产环境之间存在不一致的风险难以追踪已应用的更改数据库特定的 SQL无法在不同的驱动之间运行解决方案FluentMigrator 通过以下方式解决这些问题基于代码的迁移 数据库变更使用 C# 和 Fluent API 编写。版本控制 迁移是代码库的一部分可以提交到源代码控制系统中。自动跟踪 FluentMigrator 会跟踪已应用的迁移。数据库无关 一次编写即可在多个数据库驱动上运行回滚支持 定义可逆迁移的向上和向下方法。[Migration(20240101000000)] public class CreateUsersTable : Migration { public override void Up() { Create.Table(Users) .WithColumn(Id).AsInt32().NotNullable().PrimaryKey().Identity() .WithColumn(Username).AsString(50).NotNullable().Unique() .WithColumn(Email).AsString(255).NotNullable() .WithColumn(CreatedAt).AsDateTime().NotNullable().WithDefault(SystemMethods.CurrentDateTime); } public override void Down() { Delete.Table(Users); } }多数据库支持SQL ServerPostgreSQLMySQL / MariaDBSQLiteOracleFirebird 更多数据库支持...只需编写一次迁移代码即可在任何受支持的数据库上运行。快速入门示例通过 Nuget 安装 FluentMigrator 后添加下面的配置到您的项目中。using var serviceProvider new ServiceCollection() .AddFluentMigratorCore() .ConfigureRunner(rb rb .AddSqlServer() .WithGlobalConnectionString(connectionString) .ScanIn(typeof(MyMigration).Assembly).For.All()) .BuildServiceProvider(false); using var scope serviceProvider.CreateScope(); var runner scope.ServiceProvider.GetRequiredServiceIMigrationRunner(); runner.MigrateUp();接下面创建一个新建用户表的迁移类如下using FluentMigrator; [Migration(20240101120000)] public class CreateUsersTable : Migration { public override void Up() { Create.Table(Users) .WithColumn(Id).AsInt32().NotNullable().PrimaryKey().Identity() .WithColumn(Username).AsString(50).NotNullable().Unique() .WithColumn(Email).AsString(255).NotNullable() .WithColumn(FirstName).AsString(100).Nullable() .WithColumn(LastName).AsString(100).Nullable() .WithColumn(IsActive).AsBoolean().NotNullable().WithDefaultValue(true) .WithColumn(CreatedAt).AsDateTime().NotNullable().WithDefault(SystemMethods.CurrentDateTime); } public override void Down() { Delete.Table(Users); } }第三步调用 MigrateUp 开始运行迁移是不是非常简单/// summary /// Update the database /// /summary private static void UpdateDatabase(IServiceProvider serviceProvider) { // Instantiate the runner var runner serviceProvider.GetRequiredServiceIMigrationRunner(); // Execute the migrations runner.MigrateUp(); }执行原生 SQLFluentMigrator 内置了数据库的常见命令比如创建表删除表修改表修改列等, 如下新增表[Migration(1)] public class CreateSimpleTable : Migration { public override void Up() { Create.Table(Users) .WithColumn(Id).AsInt32().NotNullable().PrimaryKey().Identity() .WithColumn(Name).AsString(100).NotNullable() .WithColumn(Email).AsString(255).NotNullable(); } public override void Down() { Delete.Table(Users); } }添加列public class AddColumnsToTable : Migration { public override void Up() { Alter.Table(Users) .AddColumn(Email).AsString(255).Nullable() .AddColumn(CreatedAt).AsDateTime().NotNullable().WithDefaultValue(SystemMethods.CurrentDateTime) .AddColumn(IsActive).AsBoolean().NotNullable().WithDefaultValue(true); } public override void Down() { Delete.Column(Email).FromTable(Users); Delete.Column(CreatedAt).FromTable(Users); Delete.Column(IsActive).FromTable(Users); } }当然在一些复杂场景下常用命令可能满足不了需求这时候就可以使用 FluentMigrator 的原生 SQL它是支持的// Execute a simple SQL statement Execute.Sql(UPDATE Users SET IsActive 1 WHERE CreatedAt 2023-01-01); // Execute with parameter-like syntax (still basic string) Execute.Sql(DELETE FROM TempData WHERE ProcessedAt DATEADD(day, -7, GETDATE()));自动逆向迁移FluentMigrator 通过其自动回滚功能支持自动回滚许多迁移操作。当迁移仅实现了 Up() 方法时FluentMigrator 通常可以自动生成相应的 Down() 操作来撤销更改。看下面的代码public class CreateUserTable : AutoReversingMigration { public override void Up() { // ✅ 自动逆向: 创建表 → 删除表 Create.Table(Users) .WithColumn(Id).AsInt32().NotNullable().PrimaryKey().Identity() .WithColumn(Username).AsString(50).NotNullable() .WithColumn(Email).AsString(255).NotNullable() .WithColumn(CreatedAt).AsDateTime().NotNullable(); } // Down() 方法不需要因为 FluentMigrator 会自动生成: // Delete.Table(Users); }自动逆袭的实现原理是FluentMigrator 会跟踪 Up() 方法中执行的操作并在回滚迁移时自动撤销其中许多操作。此功能可减少样板代码并确保正向迁移和反向迁移之间的一致性。项目地址https://fluentmigrator.github.io引入地址
推荐一个支持自动逆向迁移的 .NET 数据库迁移框架
发布时间:2026/7/6 11:53:24
目录FluentMigrator传统数据库开发有哪些问题解决方案多数据库支持快速入门示例执行原生 SQL自动逆向迁移项目地址FluentMigrator推荐一个功能强大的 .NET 数据库迁移框架FluentMigrator 是一个用于 .NET 的迁移框架它允许您以结构化、版本控制的方式管理数据库架构变更。无需手动运行 SQL 脚本而是将迁移编写为可自动执行的 C# 类。传统数据库开发有哪些问题每个开发人员都需要手动运行 SQL 脚本数据库变更没有明确的版本控制。开发、测试和生产环境之间存在不一致的风险难以追踪已应用的更改数据库特定的 SQL无法在不同的驱动之间运行解决方案FluentMigrator 通过以下方式解决这些问题基于代码的迁移 数据库变更使用 C# 和 Fluent API 编写。版本控制 迁移是代码库的一部分可以提交到源代码控制系统中。自动跟踪 FluentMigrator 会跟踪已应用的迁移。数据库无关 一次编写即可在多个数据库驱动上运行回滚支持 定义可逆迁移的向上和向下方法。[Migration(20240101000000)] public class CreateUsersTable : Migration { public override void Up() { Create.Table(Users) .WithColumn(Id).AsInt32().NotNullable().PrimaryKey().Identity() .WithColumn(Username).AsString(50).NotNullable().Unique() .WithColumn(Email).AsString(255).NotNullable() .WithColumn(CreatedAt).AsDateTime().NotNullable().WithDefault(SystemMethods.CurrentDateTime); } public override void Down() { Delete.Table(Users); } }多数据库支持SQL ServerPostgreSQLMySQL / MariaDBSQLiteOracleFirebird 更多数据库支持...只需编写一次迁移代码即可在任何受支持的数据库上运行。快速入门示例通过 Nuget 安装 FluentMigrator 后添加下面的配置到您的项目中。using var serviceProvider new ServiceCollection() .AddFluentMigratorCore() .ConfigureRunner(rb rb .AddSqlServer() .WithGlobalConnectionString(connectionString) .ScanIn(typeof(MyMigration).Assembly).For.All()) .BuildServiceProvider(false); using var scope serviceProvider.CreateScope(); var runner scope.ServiceProvider.GetRequiredServiceIMigrationRunner(); runner.MigrateUp();接下面创建一个新建用户表的迁移类如下using FluentMigrator; [Migration(20240101120000)] public class CreateUsersTable : Migration { public override void Up() { Create.Table(Users) .WithColumn(Id).AsInt32().NotNullable().PrimaryKey().Identity() .WithColumn(Username).AsString(50).NotNullable().Unique() .WithColumn(Email).AsString(255).NotNullable() .WithColumn(FirstName).AsString(100).Nullable() .WithColumn(LastName).AsString(100).Nullable() .WithColumn(IsActive).AsBoolean().NotNullable().WithDefaultValue(true) .WithColumn(CreatedAt).AsDateTime().NotNullable().WithDefault(SystemMethods.CurrentDateTime); } public override void Down() { Delete.Table(Users); } }第三步调用 MigrateUp 开始运行迁移是不是非常简单/// summary /// Update the database /// /summary private static void UpdateDatabase(IServiceProvider serviceProvider) { // Instantiate the runner var runner serviceProvider.GetRequiredServiceIMigrationRunner(); // Execute the migrations runner.MigrateUp(); }执行原生 SQLFluentMigrator 内置了数据库的常见命令比如创建表删除表修改表修改列等, 如下新增表[Migration(1)] public class CreateSimpleTable : Migration { public override void Up() { Create.Table(Users) .WithColumn(Id).AsInt32().NotNullable().PrimaryKey().Identity() .WithColumn(Name).AsString(100).NotNullable() .WithColumn(Email).AsString(255).NotNullable(); } public override void Down() { Delete.Table(Users); } }添加列public class AddColumnsToTable : Migration { public override void Up() { Alter.Table(Users) .AddColumn(Email).AsString(255).Nullable() .AddColumn(CreatedAt).AsDateTime().NotNullable().WithDefaultValue(SystemMethods.CurrentDateTime) .AddColumn(IsActive).AsBoolean().NotNullable().WithDefaultValue(true); } public override void Down() { Delete.Column(Email).FromTable(Users); Delete.Column(CreatedAt).FromTable(Users); Delete.Column(IsActive).FromTable(Users); } }当然在一些复杂场景下常用命令可能满足不了需求这时候就可以使用 FluentMigrator 的原生 SQL它是支持的// Execute a simple SQL statement Execute.Sql(UPDATE Users SET IsActive 1 WHERE CreatedAt 2023-01-01); // Execute with parameter-like syntax (still basic string) Execute.Sql(DELETE FROM TempData WHERE ProcessedAt DATEADD(day, -7, GETDATE()));自动逆向迁移FluentMigrator 通过其自动回滚功能支持自动回滚许多迁移操作。当迁移仅实现了 Up() 方法时FluentMigrator 通常可以自动生成相应的 Down() 操作来撤销更改。看下面的代码public class CreateUserTable : AutoReversingMigration { public override void Up() { // ✅ 自动逆向: 创建表 → 删除表 Create.Table(Users) .WithColumn(Id).AsInt32().NotNullable().PrimaryKey().Identity() .WithColumn(Username).AsString(50).NotNullable() .WithColumn(Email).AsString(255).NotNullable() .WithColumn(CreatedAt).AsDateTime().NotNullable(); } // Down() 方法不需要因为 FluentMigrator 会自动生成: // Delete.Table(Users); }自动逆袭的实现原理是FluentMigrator 会跟踪 Up() 方法中执行的操作并在回滚迁移时自动撤销其中许多操作。此功能可减少样板代码并确保正向迁移和反向迁移之间的一致性。项目地址https://fluentmigrator.github.io引入地址