数据库恢复后,EF不会迁移

时间:2017-12-19 14:44:44

标签: sql-server entity-framework

我疯了......我一直在尝试编写恢复数据库的集成测试。在编写这些测试的过程中,我一直在玩我的SQL Server用户设置。最后,我拔掉了插头。但是现在我陷入了我的数据库不再被迁移的情况......

我一直收到System.Data.SqlClient.SqlException: Invalid object name 'dbo.SomeObjectThatWasCreated2MigrationsAgo'等错误。

__Migrations中的迁移落后,他们只是不会得到更新。没有任何错误消息,只是一个明显的声音,无法找到该表'

请帮助..我在SQL Server中需要哪些设置才能再次允许迁移?

我已设置权限db_datareaderdb_datawriterdb_ddladmin甚至db_owner,但我的IIS_APPPOOL用户只是无法启动迁移

修改

自上次迁移以来,没有任何代码发生任何变化。没有本地变化。没有。当我恢复数据库的备份时,会发生这种情况。然后,一旦达到此状态,删除数据库甚至不再有帮助,不会生成新的数据库。

D'你知道最后修复它的是什么,经过几个小时的搞乱?重新编译。没错,在恢复数据库后,我必须重新编译我的应用程序。即使我没有做任何改变。即使我在恢复数据库之前编译了应用程序。而且无论在上一次迁移的开发过程中,我都使用了那个确切的数据库来添加另一层。

我检查过,我每次都可以重现这一点。恢复数据库,不要重新编译:不执行迁移。恢复数据库并重新编译:执行迁移。

请注意,我没有代码更改有什么...

所以现在我的问题是:为什么?我感到困惑。

修改2

过了一会儿回到这里。我还有这个问题。如果我添加新的迁移,然后运行我的应用程序,它将迁移 fine

但是,如果我在迁移之前将数据库恢复到并运行我的应用程序,则不会迁移。我必须重新编译我的应用程序。更糟糕的是,如果我必须在生产中恢复我的数据库,那么我将不得不重新发布我的整个应用程序。

如果我DROP我的整个数据库,我也必须重新编译。

回答问题

这是一次自动迁移。我有AutomaticMigrationsEnabled = false

DatabaseInitializer:

    Database.SetInitializer(
            new MigrateDatabaseToLatestVersion<ApplicationDbContext, 
                    MyNameSpace.Configuration>());

编辑4 我发现我需要重新启动ApplicationPool。 这是场景:

  1. 构建应用程序
  2. 还原数据库
  3. 未应用迁移。由于缺少表格导致应用程序崩溃
  4. 这是解决方法:

    1. 构建应用程序
    2. 还原数据库
    3. 重新启动ApplicationPool
    4. 应用迁移
    5. 似乎某些内容存储在内存中,表示&#34;是的,我们已经完成了所有迁移。 Nosirree,这里无事可做。&#34;

      这可能是性能优化,但它确实很不方便,因为我无法在我们的生产环境中重置AppPool。如果有人知道如何关闭这种行为,我很乐意听到它。

1 个答案:

答案 0 :(得分:0)

我曾经有这个问题。因此,如果我已经还原了数据库,那么我通常会删除迁移的条目,然后在执行ef update命令时它将成功运行迁移,因为它将假定它从未运行过。

我也从不使用迁移来更新生产数据库。为此,我总是生成增量脚本,然后运行它们。基本上,完成第一个生产部署后,将使用备份来还原数据库,还将为数据库的稳定版本生成脚本,并在某个位置(DB_SQl1.0.sql)生成脚本,然后创建增量版本。脚本。如果创建脚本有问题,则可以直接从代码库为每个迁移分别生成这些脚本。

https://docs.microsoft.com/en-us/ef/core/managing-schemas/migrations/#generate-sql-scripts

希望对您有帮助。