.Net开源迁移框架FluentMigrator的使用。

news2025/2/28 2:51:55

在实际的开发过程中,经常会遇到数据库结构变动,比如新增表、删除表;已有的表新增字段,删除字段;修改字段属性等等。而且需要开发环境、测试环境和生产环境进行同步。如果使用的是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个字段,分别是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,启动程序后,迁移自动完成。
在这里插入图片描述
此时,数据库自动生成了2张表,分别是UsreLoginVersionInfo
在这里插入图片描述
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 下载!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1061569.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android笔记:Android 组件化方案探索与思考

组件化项目&#xff0c;通过gradle脚本&#xff0c;实现module在编译期隔离&#xff0c;运行期按需加载&#xff0c;实现组件间解耦&#xff0c;高效单独调试。 先来一张效果图 组件化初衷 APP版本不断的迭代&#xff0c;新功能的不断增加&#xff0c;业务也会变的越来越复杂…

【多模态融合】TransFusion学习笔记(2)

接上篇【多模态融合】TransFusion学习笔记(1)。 从TransFusion-L到TransFusion ok,终于可以给出论文中那个完整的框架图了&#xff0c;我第一眼看到这个图有几个疑问: Q&#xff1a;Image Guidance这条虚线引出的Query Initialization是什么意思? Q&#xff1a;图像分支中的…

flex布局与几个实例(含源码)

本文简单的说明下flex布局 有源码实例&#xff0c;后续会持续添加 flex默认主轴是横轴 容器主要有6个属性 flex-direction 决定主轴的方向 flex-direction: row | row-reverse | column | column-reverse; flex-wrap 决定是否换行 flex-wrap: nowrap | wrap | wrap-revers…

JavaAPI---replace

package daysreplace;public class ReplaceTest {public static void main(String[] args) {String str "wwxhhhhhhhhhhh333";System.out.println("替换前的字符串" str);String newstr str.replace("333", "111");System.out.prin…

(第2遍中)内存的堆空间不够 error: MSB3073 超过了 PCH 的虚拟内存范围

压缩包里打开的新工程文件&#xff0c;运行 GenerateProjectFiles.bat 后&#xff0c;再点击 .sln 文件&#xff0c;编译工程&#xff0c;编译了 1.5h 左右&#xff0c;快结束的时候报错如下&#xff1a; 编译器的堆空间不足在第2遍中编译器的堆空间不足error MSB3073: 命令“…

【typescript】面向对象(下篇),包含接口,属性的封装,泛型

假期第八篇&#xff0c;对于基础的知识点&#xff0c;我感觉自己还是很薄弱的。 趁着假期&#xff0c;再去复习一遍 面向对象&#xff1a;程序中所有的操作都需要通过对象来完成 计算机程序的本质就是对现实事物的抽象&#xff0c;抽象的反义词是具体。比如照片是对一个具体的…

大恒IFrameData IImageData转bmp HObject Mat

大恒工业相机采集的帧数据转为其他8bit图像格式 C#转为bmp格式转为Halcon的HObject格式转为OpenCVSharp的Mat格式 回调采集图像的数据类型为IFrameData&#xff0c;单帧采集的数据类型为IImageData&#xff0c;两者的区别为IImageData类多了一个**Destroy()**方法 C# 转为bm…

floyd算法细节

这个不是一篇学习性文章 主要是针对这几天思考的问题进行一些回答 floyD在计网和数据结构和图模型中有广泛的应用算法 很简单但是其中蕴含的原理值得细究。 弗洛伊德算法(Floyd)主要针对多源最短路径,且可以解决路径中有负权的情况(不包含负权回路),但是迪杰斯特拉算法只…

mycat实现mysql读写分离

架构图&#xff1a; 视频地址

逐步解决Could not find artifact com:ojdbc8:jar:12

Could not find artifact com:ojdbc8:jar:12 in central (https://repo.maven.apache.org/maven2) 原因&#xff1a; ojdbc8:jar:12 属于Oracle 数据库链接的一个程序集&#xff0c;缺失的话很有可能会影响数据库链接&#xff0c;蝴蝶效应产生不可预测的BUG&#xff01;但是版…

typescript开发环境搭建

typescript是基于javascript的强类型标记性语言&#xff0c;使用typescript语言可开发出不同规模的、易于扩展的web前端页面应用&#xff0c;本文主要描述typescript的开发环境搭建。 npm install -g typescript 如上所示&#xff0c;在本地开发环境中&#xff0c;使用nodejs…

arduino嵌入式1,LED闪烁案例

CVE系列在等等吧&#xff0c;环境我有点懒得搭建了 文章目录 前言一、anduino是什么玩意儿&#xff1f;二、使用步骤1.找蓝图/画蓝图2.写入数据成果 总结 前言 最近在学习嵌入式开发&#xff0c;我的单片机到了&#xff0c;然后我就沉迷于嵌入式开发的环境中 提示&#xff1a;…

1300*B. Sort the Array(排序构造)

题意&#xff1a; 一个无重复数字的序列&#xff0c;能否反转一个区间使其成为单增序列。 解析&#xff1a; 记录每个点的值和初始下标&#xff0c;然后排序。 对于排好序的序列进行遍历&#xff0c;找出第一段和原序列下标不同的区间并且标记&#xff08;此区间即为翻转的区…

SpringCloud Alibaba - Seata 四种分布式事务解决方案(XA、AT)+ 实践部署(上)

目录 一、Seata 分布式事务解决方案 1.1、XA 模式 1.1.1、XA模式理论 第一阶段&#xff1a; 第二阶段&#xff1a; 1.1.2、Seata 框架中的 XA 模式 第一阶段&#xff1a; 第二阶段&#xff1a; 1.1.3、XA 模式的优缺点 1.2.4、实现Seata 的 XA 模式 a&#xff09;修改…

建筑施工行业招投标资源众包分包系统站点开发

一款针对建筑、施工行业开发的程序系统平台&#xff0c;运营方可以招募企业发布招投标信息以及招聘信息。 核心功能&#xff1a;一、项目招投标众包发布和投标 企业可以根据自身资源或者实际需求发布参与招投标信息&#xff0c;程序后台可以管理、审核用户发布的信息。参与招…

【C++】AVL树 红黑树

AVL树 AVL树也是二叉搜索树的一种。因为对于普通的二叉搜索树&#xff0c;当插入的数据在有序或接近有序的情况下&#xff0c;二叉搜索树很可能退化成单支树&#xff0c;导致查找效率低下。而AVL树就很好的解决了这个问题。 首先&#xff0c;AVL树是一棵二叉搜索树。同时对于A…

appscan的两种手动探索扫描方式

文章目录 一、使用火狐FoxyProxy浏览器代理探索二、使用appscan内置浏览器探索 一、使用火狐FoxyProxy浏览器代理探索 首先火狐浏览器需安装FoxyProxy 先在扩展和主题里搜FoxyProxy 选FoxyProxy Standard,然后添加到浏览器就行 添加后浏览器右上角会有这个插件 打开apps…

JVM篇---第三篇

系列文章目录 文章目录 系列文章目录一、什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?二、Java内存结构三、说说对象分配规则一、什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? Java虚拟机是一个可以执行Java字节码的虚拟机进程。Java源文…

Maven 中引用其他项目jar包出现BOOT-INF问题

问题 在B项目中引入A项目的类&#xff0c;但是发现怎么也引入不进来 A项目打包之后&#xff0c;想在B项目中引用jar 在B项目中发现类文件无法引用 参考网上进行清缓存等一系列操作都没有解决。 最后发现引用的jar包中包含BOOT-INF&#xff0c; 然后去A项目中查找&#xff…

云原生边缘计算KubeEdge安装配置

1. K8S集群部署&#xff0c;可以参考如下博客 请安装k8s集群&#xff0c;centos安装k8s集群 请安装k8s集群&#xff0c;ubuntu安装k8s集群 2.安装kubEedge 2.1 编辑kube-proxy使用ipvs代理 kubectl edit configmaps kube-proxy -n kube-system #修改kube-proxy#大约在40多行…