【发布时间】:2019-06-28 08:51:37
【问题描述】:
在开发我们的应用程序一段时间后,我们积累了相当多的 EFCore 数据库迁移。由于 EFCore 为每次迁移添加了整个 db 模型的快照,因此这段代码加起来相当多。经过分析,我们大约 80% 的编译时间都花在了迁移上(编译 + Roslyn 分析器)。
所以是时候清理一些旧的迁移了!但是最好的方法是什么?似乎没有任何官方指导...
我们不需要任何回滚(我们只前滚),所以这让事情变得更简单。我们确实需要支持从头开始创建数据库,以及从最近几次迁移中更新数据库。
我尝试过的:
核选项似乎是删除所有迁移和模型快照,并创建一个新的初始迁移。虽然这很好,但似乎有点危险。使用这种方法,我们需要非常注意数据库模式的每个部分都是代码模型的一部分。例如,我们遇到的一个极端情况是 EFCore 还不支持检查约束。所以我们在迁移中添加了一个检查约束,但在代码模型中没有。因此,在创建新的初始迁移时,检查的约束不是其中的一部分。
作为一个实验,我尝试从所有旧迁移中删除模型快照,因为快照占了导致编译时间长的代码的 90%。我发现,EFCore 仅使用快照作为比较工具来进行新的迁移。删除快照后,旧迁移在新数据库上运行时不再执行。
那么有没有更好的方法来完成我想要的?
【问题讨论】:
-
很奇怪,根据this,解决方案 2 应该可行。
-
刚刚测试了解决方案 2 是否适用于 EFCore 2.0。遇到了与我描述的相同的问题(没有 Designer 文件的新数据库不运行迁移)。
-
我在 EFCore 存储库上为解决方案 2 创建了一个问题:github.com/aspnet/EntityFrameworkCore/issues/16331
-
第一个解决方案对我有用,但是是的,你提到了一个好点,它可能很危险。
标签: entity-framework .net-core entity-framework-core