EF Code-First迁移提示存在未决变更但实际无变更的问题
解决MVC 5中EF迁移执行Update时报Pending Changes错误的问题
我来帮你搞定这个EF迁移的头疼问题!你遇到的情况是EF明明检测到了模型和数据库的差异,但add-migration却生成空的迁移文件,就算添加了这个空迁移,执行migrator.Update()还是报错——这大概率是EF的模型快照和实际模型不一致,导致它一直认为有未处理的变更。下面是一步步的解决方法:
方法一:启用自动迁移(快速解决)
如果你的场景允许自动迁移(不需要手动控制迁移代码),可以直接在你的DbMigrationsConfiguration配置里开启自动迁移,同时配置数据丢失的处理策略:
public async Task<ActionResult> UpdateDatabase(UpdateDatabaseModel updateDatabaseModel) { DbMigrationsConfiguration migrationsConfiguration = new DbMigrationsConfiguration { TargetDatabase = new DbConnectionInfo("DefaultConnection"), ContextType = typeof(ApplicationDbContext), MigrationsAssembly = typeof(ApplicationDbContext).Assembly, // 新增这两行配置 AutomaticMigrationsEnabled = true, AutomaticMigrationDataLossAllowed = true // 若不允许数据丢失,可设为false,但可能会在有破坏性变更时报错 }; var migrator = new DbMigrator(migrationsConfiguration); migrator.Update(updateDatabaseModel.SelectedMigration); return this.View("ManageApplication"); }
配置完成后,EF会自动处理模型和数据库的差异,不需要手动生成迁移文件。
方法二:修复代码迁移(保持手动控制)
如果必须用代码迁移,那需要解决add-migration生成空迁移的问题,步骤如下:
- 先删除你之前生成的空迁移文件(包括对应的
.cs和.Designer.cs文件) - 找到Migrations文件夹下的
ApplicationDbContextModelSnapshot.cs文件(这是EF跟踪模型状态的快照),删除它 - 清理你的项目(右键项目 -> 清理),然后重新生成项目
- 打开Package Manager Console,运行命令:
这时候EF会重新生成完整的模型快照和迁移代码,里面应该会包含之前未被检测到的模型变更add-migration FixPendingChanges - 接着运行命令把迁移应用到数据库:
update-database - 之后再执行你的Action里的
migrator.Update(),就不会再报pending changes的错误了
额外排查点
- 检查你的
ApplicationDbContext,确认所有实体的DbSet都已正确声明,没有遗漏的实体或属性变更(比如新增字段、修改数据类型、调整Nullable属性等) - 确认数据库的
__MigrationHistory表中的记录和你项目中的迁移文件完全一致,如果有不一致的记录,可以手动删除(操作前请备份数据库)
内容的提问来源于stack exchange,提问作者Matthias Burger
相关产品推荐
相关产品推荐

