C#怎么使用FluentMigrator数据迁移_C#数据库迁移工具教程【实战】

裘德小鎮的故事

裘德小鎮的故事

2026-05-13

448人浏览

原创

fluentmigrator要求migration类必须满足四项硬性约束:版本号为long型、类为public、继承migration基类、程序集完整引用fluentmigrator及对应数据库驱动;列类型须显式声明,主键需同时调用primarykey().identity(),down()操作须精准可逆,且程序集加载路径与依赖必须正确配置。

c#怎么使用fluentmigrator数据迁移_c#数据库迁移工具教程【实战】

FluentMigrator 不是“写完就能跑”的迁移工具,它对类声明、程序集加载、类型映射和可逆性有硬性约束。跳过任一环节,Up() 方法可能执行成功,但 Down() 会失败,或命令行报 No migrations found,甚至运行时抛 No type mapping is configured for type 'DateTime'

Migration 类必须满足这四个硬性条件

缺一不可,否则编译通过但运行时报错或被忽略:

  • [Migration] 特性里的版本号必须是 long 类型(64 位),比如 [Migration(20260506120000)];写成 20260506 会被截断为 int,导致匹配失败
  • 类必须是 public,不能是 internalprivate 或抽象类
  • 必须继承 Migration 基类(来自 FluentMigrator 包),不能只实现 IMigration
  • 所在程序集必须引用完整 NuGet 包:FluentMigrator + FluentMigrator.Runner + 对应数据库驱动(如 FluentMigrator.Runner.SqlServer);仅引用 FluentMigrator.Core 不够

Create.Table() 必须显式指定列类型和主键行为

FluentMigrator 不做 C# 类型到数据库类型的自动推导。直接写 .AsType(typeof(DateTime)) 或漏掉 .Identity(),会在 SQL Server 等引擎上直接报错。

ApiPost接口调试与文档生成工具
ApiPost接口调试与文档生成工具

ApiPost是一个支持团队协作,支持模拟POST、GET、PUT等常见请求,并可直接生成文档的API调试、管理工具,ApiPost是后台接口开发者或前端、接口测试人员的工作必备工具。快速生成、一键导出API文档。感兴趣的朋友快来下载吧。软件说明ApiPost官方版是一款十分出色的接口调试与文档生成工具,ApiPost官方版界面美观大方,功能强劲实用,支持团队协作,支持模拟POST、GET、PUT等常见请求,是后台接口开发者或前端、接口测试人员的工作必备工具。软件特色更方便支持接口调试的同时快速生成、一键

下载
  • .AsDateTime().AsInt32().AsString(100) —— 这些是内置安全映射
  • 主键必须同时调用 .PrimaryKey().Identity();只写 .PrimaryKey() 会导致 SQL Server 报 “无法向表中添加标识列”
  • 外键不能嵌在 Create.Table() 链里,得单独写:Create.ForeignKey("FK_Users_Roles").FromTable("Users").ForeignColumn("RoleId").ToTable("Roles").PrimaryColumn("Id")

Down() 不是 Delete.Table() 的快捷方式

很多初学者把 Down() 当成“删表回滚”,结果上线后因表里已有数据而迁移失败。真正的可逆性要求你撤销变更本身。

  • 加了列?Down 里用 Delete.Column("NewCol").FromTable("Users")(注意:SQL Server 要求该列无默认值、无约束、无索引)
  • 改了列类型?不能简单反向改,得先 Alter.Column("Age").OnTable("Users").ToDouble()ToDouble()ToInt32(),更稳妥的是建临时列、拷贝数据、删旧列、重命名
  • 重命名表?必须用 Rename.Table("OldName").To("NewName");用 Delete.Table + Create.Table 会让 Down 无法还原
  • 新增的索引、约束、默认值,Down 里都得对应删除,否则下次 Up 可能因对象已存在而失败

命令行找不到 Migration 类?检查程序集加载路径

dotnet fm migrate -p sqlserver -c "..." -a MyMigrations.dllNo migrations found,90% 是因为程序集没被正确加载。

  • 确保 MyMigrations.dll 所在目录下有所有依赖 DLL(特别是 FluentMigrator.dllFluentMigrator.Runner.dll 等),.NET 6+ SDK 项目需在 .csproj 中加:<copylocallockfileassemblies>true</copylocallockfileassemblies>
  • 检查 -a 参数指向的是包含 Migration 类的程序集(不是主 Web 项目或控制台项目,建议单独建 Migrations 类库)
  • dotnet fm list -a MyMigrations.dll 验证是否能列出迁移版本;如果为空,说明扫描失败,优先查程序集引用和 public 修饰符

最易被忽略的一点:FluentMigrator 默认不校验 Down 操作是否真能执行成功。它只保证语法合法,不保证数据库当前状态允许该操作(比如删一个带数据的列)。上线前务必在测试库中完整走一遍 MigrateUpMigrateDownMigrateUp 流程,而不是只测 Up。

相关专题

更多
c#是什么意思
c#是什么意思

C#是一种通用的面向对象编程语言,它在.NET框架上运行,可用于开发各种类型的应用程序。本专题为大家提供c#相关的各种文章、以及下载和课程。

2023.08.08

526

5

什么是c#
什么是c#

C#(读作C Sharp)是一种现代的、通用的、面向对象的编程语言。它由微软公司开发,于2000年首次发布,主要用于开发Windows桌面应用程序、Web应用程序、移动应用程序以及游戏开发等领域。C#是一种类型安全和托管的编程语言,它结合了C++的强大性能和C语言的简单易学特点,并引入了许多新的特性和概念,如委托、属性、泛型和异步编程等,以提高开发效率和代码可维护性。

2023.08.31

1133

3

C#中base关键字的用法
C#中base关键字的用法

在C#中,base关键字用于访问当前类的基类成员,这包括基类的字段、属性、方法、构造函数、索引器以及事件。想了解更多C#的相关内容,可以阅读本专题下面的文章。

2024.03.13

556

8

C#Task用法
C#Task用法

Task在C#中是用于表示异步操作的对象,它位于System.Threading.Tasks命名空间中。想了解更多C#中各种用法的相关内容,可以阅读本专题下面的文章。

2024.03.14

1028

11

C# 并发与异步编程
C# 并发与异步编程

本专题系统讲解 C# 异步编程与并发控制,重点介绍 async 和 await 关键字、Task 类、线程池管理、并发数据结构、死锁与线程安全问题。通过多个实战项目,帮助学习者掌握 如何在 C# 中编写高效的异步代码,提升应用的并发性能与响应速度。

2026.02.03

147

18

C# 多线程与异步编程
C# 多线程与异步编程

本专题深入讲解 C# 中多线程与异步编程的核心概念与实战技巧,包括线程池管理、Task 类的使用、async/await 异步编程模式、并发控制与线程同步、死锁与竞态条件的解决方案。通过实际项目,帮助开发者掌握 如何在 C# 中构建高并发、低延迟的异步系统,提升应用性能和响应速度。

2026.02.06

202

20

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

2026.03.11

526

24

C# Unity游戏开发与ECS架构实践
C# Unity游戏开发与ECS架构实践

本专题聚焦 C# 在 Unity 游戏开发中的应用,系统讲解 ECS(Entity-Component-System)架构设计、游戏对象管理、性能优化与内存控制策略。通过实际游戏案例,帮助开发者构建高性能、结构清晰的游戏系统,提高游戏开发效率与运行性能。

2026.04.13

136

20

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程