使用现有迁移从EF5迁移到EF6

时间:2014-03-12 16:00:27

标签: entity-framework ef-migrations

上下文

我目前有一个基于Entity Framework 5的系统,我们希望将其升级到6。

但是,它已经应用了数十次迁移。不仅如此,我们还提供单元测试,通过创建测试数据库并更新到最新版本并返回初始版本来验证所有迁移,以确保可以正确应用所有向上和向下迁移。

根据我一直在阅读的内容,如果迁移具有不同的EF版本号,Update-database无法跨越该边界,这意味着,涵盖所有迁移的单元测试将永远无法通过。我可能会弄错,EF迁移可能是向后兼容的。

问题:

在这种情况下,将所有旧迁移实际合并到一个大型InitialCreate迁移(使用EF6重新创建),删除MigrationHistory表和“假申请”迁移到实时数据库(暂时注释掉该迁移的代码)以获取新的历史记录条目?

其次,在不久的将来更新EF时,我们还需要做些什么吗?如果是这种情况,那么看起来EF似乎缺少一些关于跨版本迁移的支持。

2 个答案:

答案 0 :(得分:3)

我最终最终实现了我在问题本身中所描述的内容。所有这些都是 AFTER 将所有内容迁移到EF6。

在我的情况下,我不仅需要将其应用于我的本地数据库,还应用于实时数据库。

我过去常常采取的步骤(希望我不会忘记任何事情,因为这是一段时间之后):

备份您的数据库(本地和实时),以防您需要撤消此操作。

首先,我们需要为整个数据库创建一个合并迁移。

  1. ConnectionString更改为指向新的空白数据库。
  2. 从解决方案中物理删除所有迁移,以及初始创建迁移。
  3. 运行Add-Migration InitialCreate,它应添加迁移以重新生成整个数据库。
  4. 现在你真的不想进行迁移。就我而言,我只需要进行单元测试,或者从头开始创建新的数据库。

    然后我们继续:

    1. ConnectionString更改回本地数据库。
    2. 以物理方式删除数据库中的MigrationHistory表(或者只删除行,我无法完全回忆起来。)
    3. 注释 InitialCreate迁移中的所有代码,以确保它在应用时不会执行任何操作。
    4. 运行Update-Database,它应该在MigrationHistory表中添加一个条目,模拟数据库的初始创建。
    5. 取消注释InitialCreate迁移中的代码。
    6. 可以对Live数据库应用相同的过程。您可以在ConnString中指向它,手动删除迁移历史记录,评论迁移的实现并应用它,模拟创建,然后取消注释。

      从那时起,数据库和迁移应该是同步的,并且单元测试(在单独的数据库上)应该能够在所有迁移上调用Down()和Up()并且仍能正常运行。

答案 1 :(得分:0)

我今天(2014年5月5日)也做了同样的事情,并没有遇到你提到的问题 并使用了建议的步骤 http://msdn.microsoft.com/en-us/library/upgradeef6.aspx 所以我的旧迁移仍然保持不变。

虽然我遇到了与其相关的其他一些问题    - Miniprofiler(需要使用新的EF6支持)
   - 和升级后重新创建所有索引有关的一个问题。

相关问题