在实际的开发过程中,经常会遇到数据库结构变动,比如新增表、删除表;已有的表新增字段,删除字段;修改字段属性等等。而且需要开发环境、测试环境和生产环境进行同步。如果使用的是EF,还是挺方便的。而非EF环境的话,就需要手工进行处理。而FluentMigrator就提供类似EF的迁移功能。

一般情况下,我们利用FluentMigrator提供的基类,编写数据结构改变的地方,然后使用FluentMigrator提供的Up()方法进行数据库迁移,使用Down()方法进行回滚操作。

我使用的FluentMigrator版本为3.3.2

Fluent Migrator提供了5个不同的类库来支持不同的场景。

FluentMigrator目前支持的数据库包括:

  • Microsoft SQL Server系列
  • PostgreSQL系列
  • MySQL 4/5
  • Oracle
  • Access
  • SQLite
  • Firebird
  • Amazon Redshift
  • SAP Hana
  • DB2
  • DB2 iSeries

入门例子

1.创建一个示例项目
.Net开源迁移框架FluentMigrator的使用。-LMLPHP

2.添加 NuGet 包:

根据自己使用的数据库,安装需要的NuGet 包。例如

Sqlite数据库:

# 迁移脚本基础库
dotnet add package FluentMigrator
​
# 迁移脚本运行库
dotnet add package FluentMigrator.Runner
​
# 针对Sqlite的迁移脚本支持库
dotnet add package FluentMigrator.Runner.SQLite
​
# ADO.NET针对Sqlite的驱动器
dotnet add package Microsoft.Data.Sqlite

MySQL数据库:

# 迁移脚本基础库
dotnet add package FluentMigrator
​
# 迁移脚本运行库
dotnet add package FluentMigrator.Runner
​
# 针对MySQL的迁移脚本支持库
dotnet add package FluentMigrator.Runner.MySQL
​
# ADO.NET针对MySQL的驱动器
dotnet add package MySQL.Data

其他数据库类似进行添加即可。其他数据库类似进行添加即可。​
由于我使用的是SQLServer数据库,所以安装NuGet 包的时候,是这样的

# 迁移脚本基础库
dotnet add package FluentMigrator
​
# 迁移脚本运行库
dotnet add package FluentMigrator.Runner
​
# 针对SQLServer的迁移脚本支持库
dotnet add package FluentMigrator.Runner.SqlServer

根据官方文档,我们先创建一个迁移类,AddUserLoginTable。迁移类会创建一个UserLogin表:

  • 表中有3个字段,分别是iduser_idlogin_time
  • id字段是Int64类型,且自增
  • user_id字段是Int64类型
  • login_time是DateTime类型
using FluentMigrator;
namespace FluentMigratorTest
{
    [Migration(20231001121800)]
    public class AddUserLoginTable : Migration
    {
        public override void Up()
        {
            Create.Table("UserLogin")
                .WithColumn("id").AsInt64().PrimaryKey().Identity()
                .WithColumn("user_id").AsInt64()
                .WithColumn("login_time").AsDateTime();
        }

        public override void Down() 
        {
            Delete.Table("UserLogin");
        
        }

    }
}

编写完迁移类之后,就可以开始运行迁移类了。FluentMigrator有两种迁移方式:

  • 进程内执行器(推荐)
  • 进程外执行器

一般来说,使用进程内执行器就可以了,所谓的进程内执行器,就是借助FluentMigrator.Runner库,在程序内调用IMigrationRunner接口对象的MigrateUp方法进行数据库迁移。而进程外执行器是需要安装FluentMigrator.DotNet.Cli这个工具来进行数据库迁移
安装FluentMigrator.DotNet.Cli要保证已经安装了.Net Core2.1或以上版本的SDK。

进程内执行器

修改Program.cs文件,内容如下:

using FluentMigrator.Runner;
using FluentMigratorTest;

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
//builder.Services.AddRazorPages();


var app = builder.Build();

var serviceProvider = TestFluentMigrator.CreateServices();
using (var scope = serviceProvider.CreateScope())
{
    TestFluentMigrator.UpdateDatebase(scope.ServiceProvider);
}

app.Run();


partial class TestFluentMigrator
{
    

    public static ServiceProvider CreateServices()
    {
        return new ServiceCollection()
            //添加FluentMigrator
            .AddFluentMigratorCore()
            .ConfigureRunner(rb=>rb
                //sqlserver数据库支持
                .AddSqlServer()
                //配置连接字符串
                .WithGlobalConnectionString("Server=(local);database=dotnet;uid=dotnet;pwd=123456")
                //迁移配置
                .ScanIn(typeof(AddUserLoginTable).Assembly).For.Migrations()
            )
            //添加控制台日志,就是为了能清楚的看到迁移过程
            .AddLogging(option=>option.AddFluentMigratorConsole())
            //构建服务。
            .BuildServiceProvider(false);
    }
    public static void UpdateDatebase(IServiceProvider serviceProvider)
    {
        //初始化进程内迁移
        var runner = serviceProvider.GetRequiredService<IMigrationRunner>();
        //执行迁移脚本
        runner.MigrateUp();
    }
}

完成后,按F5,启动程序后,迁移自动完成。
.Net开源迁移框架FluentMigrator的使用。-LMLPHP
此时,数据库自动生成了2张表,分别是UsreLoginVersionInfo
.Net开源迁移框架FluentMigrator的使用。-LMLPHP
VersionInfo 表记录了每次迁移的记录
.Net开源迁移框架FluentMigrator的使用。-LMLPHP

进程外执行器

使用命令行,添加FluentMigrator.DotNet.Cli

dotnet tool install -g FluentMigrator.DotNet.Cli

安装完成后,就可以使用这个工具进行数据库迁移了

dotnet fm migrate -p sqlserver -c "Server=(local);database=dotnet;uid=dotnet;pwd=123456" -a ".\bin\Debug\net7.0\FluentMigratorTest.dll"

至此,FluentMigrator的基本使用方法就介绍到这,更多的使用方法,可以参考官方文档。

本文完整DEMO下载

10-05 14:36