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

FluentMigrator 不是“写完就能跑”的迁移工具,它对类声明、程序集加载、类型映射和可逆性有硬性约束。跳过任一环节,Up() 方法可能执行成功,但 Down() 会失败,或命令行报 No migrations found,甚至运行时抛 No type mapping is configured for type 'DateTime'。
Migration 类必须满足这四个硬性条件
缺一不可,否则编译通过但运行时报错或被忽略:
-
[Migration]特性里的版本号必须是long类型(64 位),比如[Migration(20260506120000)];写成20260506会被截断为int,导致匹配失败 - 类必须是
public,不能是internal、private或抽象类 - 必须继承
Migration基类(来自FluentMigrator包),不能只实现IMigration - 所在程序集必须引用完整 NuGet 包:
FluentMigrator+FluentMigrator.Runner+ 对应数据库驱动(如FluentMigrator.Runner.SqlServer);仅引用FluentMigrator.Core不够
Create.Table() 必须显式指定列类型和主键行为
FluentMigrator 不做 C# 类型到数据库类型的自动推导。直接写 .AsType(typeof(DateTime)) 或漏掉 .Identity(),会在 SQL Server 等引擎上直接报错。
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.dll 报 No migrations found,90% 是因为程序集没被正确加载。
- 确保
MyMigrations.dll所在目录下有所有依赖 DLL(特别是FluentMigrator.dll、FluentMigrator.Runner.dll等),.NET 6+ SDK 项目需在.csproj中加:<copylocallockfileassemblies>true</copylocallockfileassemblies> - 检查
-a参数指向的是包含 Migration 类的程序集(不是主 Web 项目或控制台项目,建议单独建Migrations类库) - 用
dotnet fm list -a MyMigrations.dll验证是否能列出迁移版本;如果为空,说明扫描失败,优先查程序集引用和public修饰符
最易被忽略的一点:FluentMigrator 默认不校验 Down 操作是否真能执行成功。它只保证语法合法,不保证数据库当前状态允许该操作(比如删一个带数据的列)。上线前务必在测试库中完整走一遍 MigrateUp → MigrateDown → MigrateUp 流程,而不是只测 Up。









