EF 在数据库还原后不会迁移

EF won't migrate after database restore

提问人:Diana 提问时间:12/19/2017 最后编辑:Diana 更新时间:12/4/2021 访问量:1093

问:

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

我不断收到这样的错误。System.Data.SqlClient.SqlException: Invalid object name 'dbo.SomeObjectThatWasCreated2MigrationsAgo'

表中的迁移远远落后,只是不会更新。没有错误消息,只有刺耳的“不,找不到那张桌子”__Migrations

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

我已经设置了权限、甚至权限,但我的IIS_APPPOOL用户不会启动迁移db_datareaderdb_datawriterdb_ddladmindb_owner

编辑

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

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

我检查了一下,每次都可以重现。还原数据库并且不重新编译:不执行迁移。还原数据库并重新编译:执行迁移。

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

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

编辑 2

过了一会儿再来。我还有这个问题。如果我添加新的迁移,然后运行我的应用程序,它会正常迁移。

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

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

回答问题

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

DatabaseInitializer:

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

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

  1. 构建应用程序
  2. 还原数据库
  3. 未应用迁移。由于缺少表,应用程序崩溃

解决方法如下:

  1. 构建应用程序
  2. 还原数据库
  3. 重新启动 ApplicationPool
  4. 应用迁移

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

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

sql-server 实体框架

评论

2赞 Steve Greene 12/20/2017
这听起来更像是搞砸了迁移,而不是安全性。我将首先通过生成脚本来查看 EF 尝试执行的操作。您可以做的另一件事是将连接字符串指向新数据库并确保其正常工作。update-database -Script
1赞 grek40 7/4/2018
我们谈论的是自动迁移还是手动迁移?配置了什么数据库初始值设定项?
0赞 Diana 7/5/2018
@grek40,添加了上述问题的答案。
0赞 grek40 7/5/2018
抱歉,我一直在使用手动迁移,所以我对自动迁移的内部和陷阱了解不够。我避免使用它们,因为我不完全信任 EF 脚手架。
1赞 Diana 7/9/2018
@IvanStoev 感谢您的尝试。

答:

0赞 mukesh joshi 1/31/2019 #1

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

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

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

我希望它有所帮助。

0赞 Patricio Contreras Pardo 12/4/2021 #2

我遇到过两次同样的问题。我也找不到解决方案,但这是我使用的解决方法:

  1. 备份数据库
  2. 创建另一个数据库
  3. 将连接字符串更改为此新数据库
  4. 更新到新数据库的迁移
dotnet ef database update
  1. 删除迁移表的所有记录:
delete from currentDB..[__EFMigrationsHistory] 
  1. 从新数据库复制所有迁移:
insert into currentDB..[__EFMigrationsHistory] 
select * from newDatabase..[__EFMigrationsHistory]