我快要疯了...我一直在尝试编写恢复数据库的集成测试。在编写这些测试的过程中,我一直在调整我的 SQL Server 用户设置。最后,我终止了这件事。但现在我陷入了数据库不再被迁移的情况......
我不断收到类似 System.Data.SqlClient.SqlException: Invalid object name 'dbo.SomeObjectThatWasCreated2MigrationsAgo'
的错误。
表中的迁移__Migrations
远远落后,而且不会更新。没有错误消息,只是响亮的“不,找不到该表”
请帮忙..我需要在 SQL Server 中进行哪些设置才能允许再次迁移?
我已经设置了权限db_datareader
、db_datawriter
、db_ddladmin
甚至db_owner
,但我的IIS_APPPOOL用户刚刚赢了不启动迁移
编辑
自上次迁移以来没有任何代码更改。没有局部变化。没有什么。当我恢复数据库的备份时,就会发生这种情况。然后,一旦达到这种状态,删除数据库甚至不再有帮助,不会生成新的数据库。
经过几个小时的折腾,你知道最后是什么解决了这个问题吗?重新编译。没错,恢复数据库后我必须重新编译我的应用程序。尽管我没有做任何改变。即使我在恢复数据库之前已经编译了应用程序。尽管在上次迁移的开发过程中,我使用了该数据库来添加另一层。
我检查过,每次都可以重现。恢复数据库并且不重新编译:未执行迁移。恢复数据库并重新编译:执行迁移。
请注意,我没有任何代码更改无论如何...
所以现在我的问题是:为什么?我很困惑。
编辑2
过一会儿再回到这个话题。我仍然有这个问题。如果我添加一个新的迁移,然后运行我的应用程序,它会很好地迁移。
但是,如果我随后将数据库恢复到迁移之前并运行我的应用程序,它就不会迁移。我必须重新编译我的应用程序。更糟糕的是,如果我必须在生产中恢复数据库,那么我将不得不重新发布我的整个应用程序。
如果我删除整个数据库,我还必须重新编译。
回答问题
这是自动迁移。我有 AutomaticMigrationsEnabled = false
数据库初始化器:
Database.SetInitializer(
new MigrateDatabaseToLatestVersion<ApplicationDbContext,
MyNameSpace.Configuration>());
编辑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/