Fluent Migrator是一个基于.NET的迁移框架,你可以像使用Ruby on Rails Migrations一样使用它。Fluent Migrator的最新版本是3.13版,官网地址https://github.com/fluentmigrator/fluentmigrator。 你可以使用C#编写数据库迁移类,而不需要编写任何SQL脚本。从使用方式上看,它非常像EF/EF Core的数据库迁移脚本,但是它支持的数据库类型比EF/EF Core多的多,且不受限与EF/EF Core。
支持的数据库列表
Microsoft SQL Server 2017
Microsoft SQL Server 2016
Microsoft SQL Server 2014
Microsoft SQL Server 2008
Microsoft SQL Server 2005
Microsoft SQL Server 2000
Microsoft SQL Server Compact Edition
PostgreSQL
MySQL 4
MySQL 5
Oracle
Oracle (managed ADO.NET)
Oracle (DotConnect ADO.NET)
Microsoft JET Engine (Access)
SQLite
Firebird
Amazon Redshift
SAP Hana
SAP SQL Anywhere
DB2
DB2 iSeries
Fluent Migrator提供了5个不同的类库来支持不同的场景。
Package
描述
FluentMigrator
创建数据库所需的基础程序集
FluentMigrator.Runner
进程内执行数据库迁移所需的程序集
FluentMigrator.Console
进程外执行数据库迁移所需的程序集,它兼容.NET 4.0/4.5/.NET Core 2.0
FluentMigrator.MSBuild
兼容.NET 4.0/4.5/.NET Standard 2.0的MSBuild任务
FluentMigrator.DotNet.Cli
可执行数据库迁移的.NET Core CLI工具
入门例子
这里我们首先演示一个最简单的数据库迁移例子,为一个MySql数据库添加一个日志表。
创建控制台程序
我们使用.NET Core CLI创建一个.NET Core的命令行程序。
# 迁移脚本基础库 dotnet add package FluentMigrator # 迁移脚本运行库 dotnet add package FluentMigrator.Runner # 针对MySQL的迁移脚本支持库 dotnet add package FluentMigrator.Runner.MySQL # ADO.NET针对MySQL的驱动器 dotnet add package MySQL.Data
添加第一个数据库迁移类
未了创建一个名为Log的表,这里需要创建一个数据库迁移类
Log表中有2个字段,一个是Id字段,一个是Text字段
Id字段是Int64类型的主键,且自增
Text字段是字符串字段
using FluentMigrator; namespace test { [Migration(20180430121800)] public class AddLogTable : Migration { public override void Up() { Create.Table("Log") .WithColumn("Id").AsInt64().PrimaryKey().Identity() .WithColumn("Text").AsString(); } public override void Down() { Delete.Table("Log"); } } }
运行迁移类
编写完迁移类之后,我们就可以开始运行迁移类了。
Fluent Migrator有两种运行迁移脚本的方式。
使用进程内执行器(推荐)
使用进程外执行器
使用进程内执行器
所谓的进行内执行器,其实就是借助FluentMigrator.Runner库,在程序内部手动调用IMigrationRunner接口对象的MigrateUp方法执行数据库迁移。
这里我们可以修改Program.cs文件如下。
class Program { static void Main(string[] args) { var serviceProvider = CreateServices(); using (var scope = serviceProvider.CreateScope()) { UpdateDatabase(scope.ServiceProvider); } } private static IServiceProvider CreateServices() { return new ServiceCollection() //添加FluentMigrator基础服务 .AddFluentMigratorCore() .ConfigureRunner(rb => rb //添加MySql 5.0支持 .AddMySql5() //配置连接字符串 .WithGlobalConnectionString("server=localhost;port=3307;Database=abc;UID=root;PWD=123456") //检索迁移配置 .ScanIn(typeof(AddLogTable).Assembly).For.Migrations()) //启用控制台日志 .AddLogging(lb => lb.AddFluentMigratorConsole()) //构建服务提供器 .BuildServiceProvider(false); } private static void UpdateDatabase(IServiceProvider serviceProvider) { //初始化进程内迁移构建器 var runner = serviceProvider.GetRequiredService<IMigrationRunner>(); //执行迁移脚本 runner.MigrateUp(); } }
启动程序之后,迁移自动完成。
使用进程外执行器
如果你想使用进行外迁移执行器,这里首先需要保证你已经安装了.NET Core 2.1或以上版本的SDK, 因为你需要使用.NET Core 2.1之后新增的Global Tool功能。
这里我们可以使用命令行,添加FluentMigrator.DotNet.Cli这个工具
dotnet tool install -g FluentMigrator.DotNet.Cli
安装完成之后,我们就可以使用这个工具来做数据库迁移了
dotnet fm migrate -p mysql -c "server=localhost;port=3307;Database=abc;UID=root;PWD=123456" -a ".\bin\Debug\netcoreapp2.1\test.dll"
这个方法有3个参数, 第一个参数-p指定了数据库的类型,第二个参数-c指定了连接字符串,第三个参数-a指定了包含迁移类的程序集路径。
注意:其实这里还有第四个参数command, 可选值为down/up, 如果不指定,默认是up, 即运行所有还未运行过的数据库迁移类。
方法执行后,效果和进程内执行器的效果一致。
基本概念
在展示了一个简单示例之后,我们接下来看一下Fluent Migrator中的一些基本概念。
迁移(Migrations)