上下文:
我现在有一个基于实体框架5的系统,我们希望升级到6。
然而,它已经应用了几十个迁移。不仅如此,我们还有单元测试,通过创建测试数据库并将其更新到最新和返回初始值来验证所有迁移,以确保所有向上迁移和向下迁移都能正确应用。
据我所读,如果迁移有不同的EF版本号,那么Update-database就无法跨越这一边界,这意味着涵盖所有迁移的单元测试永远不会通过。我可能弄错了,EF迁移可能是向后兼容的。
问题:
在这种情况下,是否更明智的做法是将所有旧迁移合并为一个大型InitialCreate迁移(使用EF6重新创建),删除MigrationHistory表并将迁移“假应用”到活动数据库(临时注释掉迁移的代码)以获得新的历史条目?
第二,在不久的将来更新EF时,我们还得再做一次吗?如果是这样的话,那么EF似乎缺少了对跨版本迁移的一些支持。
发布于 2014-04-19 16:17:47
最后,我最终实现了我在问题本身中描述的内容。所有这些都是在将所有东西迁移到EF6之后完成的。
在我的例子中,我不仅需要将它应用到本地数据库,还需要应用到活动数据库。
我用来完成这一步的步骤如下(希望我没有忘记任何步骤,因为这已经过去一段时间了):
备份您的数据库(包括本地的和活动的),以防您需要撤销它。
首先,我们需要为整个数据库创建一个合并的迁移。
ConnectionString更改为指向一个新的空白数据库。Add-Migration InitialCreate,它应该添加一个迁移来重新生成整个数据库。现在,您并不真正想要运行这种迁移。在我的例子中,我只需要用于单元测试,或者从头创建新的数据库。
因此,我们继续:
ConnectionString更改为本地数据库。MigrationHistory表(或者可能只是删除行,我想不起来了)。InitialCreate迁移过程中的所有代码,以确保它在应用时不会做任何事情。Update-Database,它应该向MigrationHistory表中添加一个条目,模拟数据库的初始创建。InitialCreate迁移中的代码。对于Live数据库也可以应用相同的进程。您可以在ConnString中指向它,手动删除迁移历史,注释迁移的实现并应用它,模拟创建,然后取消注释。
从那时起,数据库和迁移应该是同步的,单元测试(在单独的数据库上)应该能够对所有迁移调用Down()和Up(),并且仍然能够正常工作。
https://stackoverflow.com/questions/22357122
复制相似问题