EF Core 3中Migration的BuildTargetModel运行时作用探讨
EF Core 3 迁移中 BuildTargetModel 与快照的运行时作用
核心结论
如果你的应用只使用最新数据库版本,不需要回滚到旧迁移、也不需要基于旧迁移生成新的差异迁移,那么在运行时完全没必要保留每个迁移里的BuildTargetModel重写方法,也不需要ModelSnapshot类。
详细说明
BuildTargetModel和ModelSnapshot都是EF Core迁移工具的设计时依赖产物,和应用运行时逻辑完全不挂钩:- 生成新迁移时,工具需要对比当前DbContext的模型与上一次迁移的目标模型(由
BuildTargetModel定义),以此找出结构差异来生成对应的SQL变更脚本 - 回滚到旧数据库版本时,工具依赖这些模型快照来重建对应版本的数据库结构
- 生成新迁移时,工具需要对比当前DbContext的模型与上一次迁移的目标模型(由
- 运行时,EF Core直接基于你代码里的实体类和配置生成当前模型,用来处理数据的读写操作,根本不会去读取迁移文件里的
BuildTargetModel或者快照类的内容。这就是为什么你删掉这些代码后,应用依然能正常跑起来。
后续建议
虽然运行时不需要,但如果之后有以下需求,建议保留这些文件:
- 需要基于现有历史迁移继续生成新的迁移
- 需要回滚到某个旧的数据库版本
- 需要给其他环境部署完整的历史迁移脚本
要是现在删了,后续再需要时可能得重新生成,容易出现模型不一致的问题。
内容的提问来源于stack exchange,提问作者eric45
相关产品推荐
相关产品推荐

