Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 在多个实例中首先迁移EF代码_Asp.net Mvc_Entity Framework_Ef Code First_Entity Framework Migrations - Fatal编程技术网

Asp.net mvc 在多个实例中首先迁移EF代码

Asp.net mvc 在多个实例中首先迁移EF代码,asp.net-mvc,entity-framework,ef-code-first,entity-framework-migrations,Asp.net Mvc,Entity Framework,Ef Code First,Entity Framework Migrations,我有一个MVC应用程序,它首先使用EF6代码。我想将此应用部署到多个数据中心。在进行迁移的部署上,我可以编写脚本以尽可能同时迁移所有数据中心,但如果一个数据中心的速度较慢,则可能会拒绝所有调用,因为模式不再匹配。试图协调的脚本也会使滚动升级变得不可能 有没有办法让EF至少尝试运行查询,即使模式不匹配?有没有其他方法可以/应该这样做 更新: 让我们看看我能不能说得更好。我想在多个数据中心中使用我的MVC应用程序。假设我分别将应用程序部署到每个数据中心 选择1 部署到DC A 代码优先迁移在集中式数

我有一个MVC应用程序,它首先使用EF6代码。我想将此应用部署到多个数据中心。在进行迁移的部署上,我可以编写脚本以尽可能同时迁移所有数据中心,但如果一个数据中心的速度较慢,则可能会拒绝所有调用,因为模式不再匹配。试图协调的脚本也会使滚动升级变得不可能

有没有办法让EF至少尝试运行查询,即使模式不匹配?有没有其他方法可以/应该这样做

更新:

让我们看看我能不能说得更好。我想在多个数据中心中使用我的MVC应用程序。假设我分别将应用程序部署到每个数据中心

选择1

  • 部署到DC A
  • 代码优先迁移在集中式数据库上运行
  • 向DC A发出的请求成功,但向DC B发出的请求失败
  • 选择2

  • 部署到DC A
  • 不要自动运行迁移
  • 向DC A发出的请求失败,向DC B发出的请求继续成功
  • 我如何制定一个部署策略,使其能够满足对任一DC的请求


    顺便说一句:如果需要特定于平台的解决方案,我使用的是Azure网站。

    在你的帖子中,你似乎关心它在实际升级过程中的表现。与测试无关。但在评论中,您询问的是如何进行部分部署,然后再进行测试。因此,一方面,您希望尽快部署,以最大限度地减少停机时间。另一方面,听起来您希望在验证第一次部署时部署到一个站点,测试并让其他站点继续运行?
    验证部署是合理的,但相当复杂。我不确定你会在这方面找到多少自动化的方法我认为您应该在生产部署之前进行彻底的测试,然后在生产中尽快部署。如果只有在部署到生产时才发现问题,您的情况将很糟糕,因为现在您的站点已关闭,直到您能够修复它为止。即使您可以让另一个实例使用新数据库,这也是有风险的,因为它将根据它不完全理解的模式修改内容。此外,如果确实需要回滚DDL,那么几乎肯定会丢失自部署以来修改的所有数据。因此,最好是旧模式的所有实例在升级之前都失败,以防止它们修改有丢失风险的数据

    通常,您应该在尽可能靠近生产环境的临时环境中进行部署,以测试数据库迁移过程。这称为生产前测试,有时涉及将最近的备份从生产恢复到暂存,以确保新的约束/结构对现有数据有效。通过部署到此登台环境,您应该对生产部署将成功进行有很高的信心


    此外,您还可以通过在部署之前进行备份来保护自己免受生产部署问题的影响,以便可以根据需要进行回滚(尽管这是最坏的情况,因为这可能意味着丢弃在备份/部署和意识到存在问题之间的重要数据)。我想象EF迁移使用一个事务来运行DDL脚本,因此如果出现问题,它们应该全部回滚或不回滚。

    “在集中式数据库上运行”迁移应用于数据库,而不是应用程序实例。如果您的模式已更改,则需要为每个应用程序部署更新的代码,但不必为每个应用程序运行迁移。迁移只适用于集中式数据库。此外,我相信EF会检查数据库版本,如果版本不同,则会失败(它在两个版本之前进行过迁移,但我知道他们删除了一些迁移元数据表)。因此,在部署更新的实例时,您的第二个应用程序实例只会对向其发出的任何请求抛出错误,这通常非常快。您可以对此进行测试,确定确切的异常并捕获该异常,然后将用户发送到“正在更新的站点”消息,或者尝试将他们引导到其他实例(如果您具有该功能)。是的,您击中了它的头部。我完全可以返回错误或“站点正在更新”消息,但似乎应该有一个滚动升级的解决方案,即在将站点发送到其他服务器之前,在有限数量的服务器上测试站点。测试只是滚动升级使用方式的一个示例。微软为Outlook.com、Bing等网站做了这项工作。这是最后一分钟的健康检查,所以如果在生产过程中有什么事情没有得到解释,你不会影响到所有人。他们谈到了这一点。如果您使用的是直接SQL,滚动升级可以起作用,因为您可以将更新拆分为多个彼此了解的更新,但考虑到我是一个人的团队,这可能不值得追求,简单地说,给出一个更好的错误消息。这还不够。我认为Azure文章中的滚动升级只是处理单个实例中应用程序的更改。这听起来很棒,直到您考虑一个具有频繁模式更改的集中式DB。我发现很多这样的功能都不能很好地应对现实世界的挑战。Outlook可能对其数据库进行了大量分区,因此他们可以在升级特定数据库实例的服务器集的同时升级单个数据库实例,而不影响其他数据库实例/服务器。