在实际的开发过程中,经常会遇到数据库结构变动,比如新增表、删除表;已有的表新增字段,删除字段;修改字段属性等等。而且需要开发环境、测试环境和生产环境进行同步。如果使用的是EF,还是挺方便的。而非EF环境的话,就需要手工进行处理。而FluentMigrator就提供类似EF的迁移功能。
一般情况下,我们利用FluentMigrator提供的基类,编写数据结构改变的地方,然后使用FluentMigrator提供的Up()方法进行数据库迁移,使用Down()方法进行回滚操作。
我使用的FluentMigrator版本为3.3.2
。
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工具 |
FluentMigrator目前支持的数据库包括:
- Microsoft SQL Server系列
- PostgreSQL系列
- MySQL 4/5
- Oracle
- Access
- SQLite
- Firebird
- Amazon Redshift
- SAP Hana
- DB2
- DB2 iSeries
入门例子
1.创建一个示例项目
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个字段,分别是
id
、user_id
和login_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,启动程序后,迁移自动完成。
此时,数据库自动生成了2张表,分别是UsreLogin
和VersionInfo
VersionInfo
表记录了每次迁移的记录
进程外执行器
使用命令行,添加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下载
点击下方公众号卡片,关注我,回复
1010
下载!