Sql server 英孚元';在数据库恢复后,无法迁移

Sql server 英孚元';在数据库恢复后,无法迁移,sql-server,entity-framework,Sql Server,Entity Framework,我快疯了。。。我一直在尝试编写恢复数据库的集成测试。在编写这些测试的过程中,我一直在使用我的SQL Server用户设置。最后,我拔掉了这个插头。但现在我陷入了数据库不再被迁移的困境 我不断收到错误,如System.Data.SqlClient.SqlException:无效的对象名“dbo.someobjectthatwated2migrationsago” 表\u migrations中的迁移远远落后,无法更新。没有错误消息,只是一声“不,找不到那个表” 请帮忙。。我需要在SQL Serve

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

我不断收到错误,如
System.Data.SqlClient.SqlException:无效的对象名“dbo.someobjectthatwated2migrationsago”

\u migrations
中的迁移远远落后,无法更新。没有错误消息,只是一声“不,找不到那个表”

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

我已经设置了权限
db\u datareader
db\u datawriter
db\u ddladmin
,甚至
db\u owner
,但我的IIS\u应用程序池用户不会启动迁移

编辑

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

你知道经过几个小时的胡闹,什么东西终于把它修好了吗?重新编译。没错,在恢复数据库之后,我必须重新编译我的应用程序。即使我没有做任何改变。即使我在还原数据库之前编译了应用程序。在上一次迁移的开发过程中,我使用了这个数据库添加了另一层

我检查过了,每次都可以复制。恢复数据库,不重新编译:不执行迁移。还原数据库并重新编译:执行迁移

请注意,我没有任何代码更改

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

编辑2

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

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

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

回答问题

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

数据库初始值设定项:

    Database.SetInitializer(
            new MigrateDatabaseToLatestVersion<ApplicationDbContext, 
                    MyNameSpace.Configuration>());
Database.SetInitializer(
新的MigrateDatabaseToLatestVersion());
编辑4 我发现我需要重新启动应用程序池。 这是一个场景:

  • 构建应用程序
  • 还原数据库
  • 未应用迁移。由于缺少表而导致应用程序崩溃
  • 这是解决方法:

  • 构建应用程序
  • 还原数据库
  • 重新启动应用程序池
  • 应用迁移
  • 似乎内存中存储了这样一个信息:“是的,我们已经完成了所有迁移。Nosirree,这里没什么可做的。”


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

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

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


    我希望这会有所帮助。

    这听起来更像是混乱的迁移,而不是安全性。首先,我将通过生成脚本
    updatedatabase-script
    ,了解EF正在尝试做什么。您可以做的另一件事是将您的连接字符串指向一个新的数据库,并确保其正常工作。我们讨论的是自动迁移还是手动迁移?配置了什么数据库初始值设定项?@grek40,为您的上述问题添加了答案。对不起,我一直在使用手动迁移,因此我对自动迁移的内部结构和陷阱了解不够。“我之所以避开它们,是因为我不完全信任它们。”伊凡斯托夫谢谢你的尝试。