如何利用FluentMigrator实现数据库迁移

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(); } }

启动程序之后,迁移自动完成。

如何利用FluentMigrator实现数据库迁移

 

使用进程外执行器

如果你想使用进行外迁移执行器,这里首先需要保证你已经安装了.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)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wdszsd.html