Code First未执行全部迁移:删除数据库后更新异常排查
解决Code First删除数据库后迁移依赖缺失的问题
我之前也碰到过一模一样的情况——删了原有数据库想让Code First从头重建,结果执行update-database时它直接跳过前3个迁移,后面的迁移因为依赖前面的表/结构缺失直接失败。核心原因就是Code First的迁移追踪系统还“认定”那些迁移已经执行过,哪怕数据库都没了。下面是几个亲测有效的解决办法:
方案一:彻底重置迁移(通用EF Core/EF6)
这是最稳妥的方式,能让迁移回到完全初始的状态:
- 先把项目里
Migrations文件夹下的所有文件全删掉(包括那个xxxModelSnapshot.cs快照文件,别留尾巴) - 打开Package Manager Console(或者用.NET CLI):
- EF Core可以执行
dotnet ef migrations remove直到没有迁移可移除;直接删文件其实更干脆 - 然后创建全新的初始迁移:
Add-Migration InitialCreate(EF6)或者dotnet ef migrations add InitialCreate(EF Core) - 最后执行
Update-Database,这时候Code First会重新创建数据库,并把初始迁移的所有结构都应用上去
- EF Core可以执行
方案二:EF Core专属快速修复
如果不想删掉所有迁移,试试强制重置迁移历史:
- 先确认目标数据库已经被完全删除(去SQL Server管理工具里核对,或者执行
Drop-Database命令) - 执行
Update-Database -Migration 0,这个命令会把迁移历史重置到“从未执行过任何迁移”的状态 - 再正常执行
Update-Database,这时候它就会从第一个迁移开始依次执行,不会再跳过了
方案三:调整DbContext初始化策略
有时候是DbContext的初始化配置导致的问题,你可以在DbContext构造函数里加个强制重建的初始化器:
public class YourDbContext : DbContext { public YourDbContext() : base("YourConnectionString") { // 开发环境用这个:模型变化时自动重建数据库 Database.SetInitializer(new DropCreateDatabaseIfModelChanges<YourDbContext>()); // 如果要每次启动都重建数据库,换成这个: // Database.SetInitializer(new DropCreateDatabaseAlways<YourDbContext>()); } // 你的DbSet定义和模型配置 }
调整完配置后再重新执行迁移命令,就能正常创建数据库并应用所有迁移了
问题根源揭秘
Code First靠数据库里的迁移历史表(EF6是__MigrationHistory,EF Core是EFMigrationsHistory)追踪已执行的迁移。但如果你直接删除数据库,本地的迁移快照文件或者迁移文件本身的记录还保留着之前的状态,导致Code First误以为前3个迁移已经跑完了,直接跳去执行后面的,自然会因为依赖缺失报错。
内容的提问来源于stack exchange,提问作者Pawan Nogariya
相关产品推荐
相关产品推荐

