Entity Framework 6配置MigrateDatabaseToLatestVersion时迁移的执行顺序是怎样的
MigrateDatabaseToLatestVersion 迁移排序规则说明 排序逻辑
- 配置
MigrateDatabaseToLatestVersion后,EF 不会读取本地迁移文件的文件名做排序,排序的核心依据是迁移类上声明的[Migration]特性参数。 - 执行
Add-Migration(包管理器控制台)或dotnet ef migrations add命令生成迁移时,工具会自动为迁移类附加类似[Migration("20240520123456_InitDatabase")]的特性,特性的字符串参数正好是迁移文件名的前缀时间戳+迁移名称的组合,运行时会直接从程序集元数据中读取所有迁移类的该特性值,按字符串字典序排序,天然符合迁移生成的先后顺序。
关于时间戳读取的认知正误
该认知是错误的,运行时不需要读取文件系统的时间戳:
- 文件名的时间戳在迁移生成阶段就已经同步写入到迁移类的
MigrationAttribute参数中,编译后会存储在程序集元数据里,执行迁移时直接从程序集读取即可,不依赖本地源文件存在。 - 不建议手动修改
MigrationAttribute的参数,调整后可能和数据库__EFMigrationsHistory表中存储的已执行迁移ID不匹配,引发重复执行、迁移缺失等异常。
补充说明
- 正式执行迁移前,EF会先查询目标库的
__EFMigrationsHistory表,获取已经执行过的迁移ID列表,和程序集中读取到的所有迁移ID对比,未匹配到的迁移会按排序结果依次执行。 - 如果手动删除了迁移源文件但没有清理程序集内编译的迁移类,也可能导致迁移执行逻辑异常。
内容的提问来源于stack exchange,提问作者viraptor
相关产品推荐
相关产品推荐

