sql-server - 数据库恢复后 EF 不会迁移

标签 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用户刚刚赢了不启动迁移

编辑

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

经过几个小时的折腾,你知道最后是什么解决了这个问题吗?重新编译。没错,恢复数据库后我必须重新编译我的应用程序。尽管我没有做任何改变。即使我在恢复数据库之前已经编译了应用程序。尽管在上次迁移的开发过程中,我使用了该数据库来添加另一层。

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

请注意,我没有任何代码更改无论如何...

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

编辑2

过一会儿再回到这个话题。我仍然有这个问题。如果我添加一个新的迁移,然后运行我的应用程序,它会很好地迁移。

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

如果我删除整个数据库,我还必须重新编译。

回答问题

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

数据库初始化器:

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

编辑4 我发现我需要重新启动应用程序池。 这是场景:

  1. 构建应用
  2. 恢复数据库
  3. 未应用迁移。由于缺少表而导致应用程序崩溃

这是解决方法:

  1. 构建应用
  2. 恢复数据库
  3. 重新启动应用程序池
  4. 迁移已应用

内存中似乎存储了一些内容,上面写着“是的,我们已经完成了所有迁移。Nosirree,这里没什么可做的。”

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

最佳答案

我以前也遇到过这个问题。因此,如果我已经恢复了数据库,我曾经删除了迁移的条目,然后当我执行 ef update 命令时,它将成功运行迁移,因为它会假设它以前从未运行过。

此外,我从不使用迁移来更新生产数据库。为此,我总是生成增量脚本,然后运行它们。基本上,一旦完成第一次生产部署,我将使用备份来恢复数据库,并且还将为数据库的稳定版本生成脚本,并在某个地方(DB_SQl1.0.sql)对它们进行版本控制,然后创建增量脚本。如果创建脚本有问题,您可以直接从代码库为每个迁移单独生成脚本。

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

希望对您有所帮助。

关于sql-server - 数据库恢复后 EF 不会迁移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47889396/

相关文章:

.net - 从存储过程创建 Entity Framework 对象

c# - Entity Framework 6 Code First 自定义函数

sql - 授予用户对数据库中所有存储过程的执行权限?

sql - 标量函数中的 CTE

mysql - 如果有外键,你如何删除一行?数据库

sql - 除了 SQL Server 中的 SQL 语句未返回预期结果

mysql - 将 MySQL 添加到 Application Insights

c# - 如何在设计数据库模型中添加 Entity Framework Geolocation 属性

c# - 获取多个对象列表的属性

sql-server - SQL错误: If Else with Case When in SQL