【问题标题】:ASP.NET MVC 4, Migrations - How to run 'update-database' on a production serverASP.NET MVC 4,迁移 - 如何在生产服务器上运行“更新数据库”
【发布时间】:2013-06-05 21:40:12
【问题描述】:

我可以使用包管理器在本地运行“update-database -verbose”。

这可能是一个愚蠢的问题,但我在网上找不到它 - 一旦我的网站被部署 - 我如何在服务器上手动运行它?

其次 - 对于将数据库迁移部署到生产环境,您会推荐哪些其他策略 - 以及它们如何更可取?

谢谢

【问题讨论】:

  • 这不包括手动执行“更新数据库”——就像我在 VS 中那样。 ie - 服务器上没有包管理器控制台 - 所以你只是在 power shell 或命令行中使用命令吗?如果是这样,我无法在任何地方找到它。我想知道如何手动运行它——而不是依赖应用程序中的自动迁移。
  • 因此我想知道如何手动执行此操作

标签: asp.net-mvc entity-framework asp.net-mvc-4 entity-framework-5 entity-framework-migrations


【解决方案1】:

对我们来说,DBA 是唯一可以访问生产(和预生产)环境的群体。我们只需使用Update-Database -Script 包控制台命令来获取更新数据库所需的Sql。这会交给他们,他们可以在那里进行验证等。

对某些人来说可能有点过于简单,但它确实有效。

HTH。

【讨论】:

    【解决方案2】:

    我个人喜欢设置每次调用应用程序的启动方法时运行的自动迁移。这样,在您进行的每次部署中,您只需运行迁移并自动更新应用程序。

    查看 AppHarbor 的这篇文章。 http://blog.appharbor.com/2012/04/24/automatic-migrations-with-entity-framework-4-3

    要点基本上是您想要启用自动迁移,然后从您的代码中调用 DatabaseInitializer,无论是从 OnModelCreating 方法还是从您的 Global.asax。

    【讨论】:

      【解决方案3】:

      你有几个选择:

      • 您可以使用update-database -script 生成SQL 命令来更新服务器上的数据库
      • 您可以使用位于/packages/EntityFramework5.0.0/tools/migrate.exe 的包文件夹中的migrate.exe 可执行文件。过去,我已成功将它与 Jet Brains 的 Team City Build Server 一起使用,通过我的部署脚本设置迁移。
      • 如果您使用的是 IIS Web 部署,您可以告诉服务器在发布后执行迁移(见下图)
      • 您可以设置自动迁移,但我更愿意控制事情发生的时间:)

      更新:另外,请查看 Sayed Ibrahim's blog,他在 Microsoft 的 MsBuild 团队工作,对部署有一些深刻的见解

      【讨论】:

      • 为了控制,我总是使用这个“你可以使用 update-database -script 来生成 SQL 命令来更新服务器上的数据库”(尽管我更喜欢根本不使用自动迁移,但这是一个不同的话题)
      【解决方案4】:

      您可以使用 EF 命令 (update-database -script) 获取脚本,也可以手动编写脚本。这不是在生产环境中更新数据库最重要的事情。对我来说,最重要的是确保所有脚本都正确运行,并且它们按预期影响了记录。 在我看来,你应该有一个预生产环境,数据库应该是生产环境的副本。这样,您可以在非常相似的环境中运行脚本并部署应用程序,看看是否有任何问题。有时脚本在 DEV 环境中可以正确执行,但在生产环境中会失败。为避免头疼,您应该在预生产环境中模拟生产环境。 关于脚本,如果团队有多个开发人员,我更喜欢将脚本分类为结构脚本和数据脚本。结构脚本改变数据库的结构(添加表、向表中添加列等),数据脚本插入/更新/删除记录。此外,每个脚本都应指定其依赖项,以便它们不会以错误的顺序执行。在创建表 A 之前,无法执行在表 A 中插入行的数据脚本。这就是我所做的: -定义用于注册执行脚本的表。例如:ExecutedScriptsHistory。 - 每个脚本都有一个编号和一个名称。 - 执行脚本后,在表 ExecutedScriptsHistory 中插入新行。 - 在执行脚本之前,它会检查其依赖关系。为此,它会检查脚本是否已执行(存在于 ExecutedScriptsHistory 表中)。

      运行脚本后,您可以检查是否所有脚本都已执行检查 ExecutedScriptsHistory。此策略类似于 Microsoft 在 EF 迁移中选择的策略,但您可以完全控制它。

      【讨论】:

        【解决方案5】:

        我知道这个问题已经回答了,但供将来参考:

        其中一个选项是在 DB 上下文类的构造函数中放置类似的内容:

        public MyDbContext()
            {
                System.Data.Entity.Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyDbContext, Configuration>());            
            }
        

        【讨论】:

        • 虽然这种方法可以完成工作,但绝对不需要每次MyDbContext 实例化时都执行这行代码。因此,如果要使用这种方法,值得考虑将此代码放入MyDbContext 类的静态构造函数中。或者在Global.asax.cs 文件中的Application_Start 方法中。或者其他足够接近应用程序的组合根的地方。
        • 谢谢。这个简单的解决方案让我很开心。
        【解决方案6】:

        只是为了给大家一个简单的答案。

        这是“更新数据库” 在您的 Migrations 文件夹中,Configuration.cs:

            internal sealed class Configuration : DbMigrationsConfiguration<projectname.Models.dbContext>
        {
            public Configuration()
            {
                AutomaticMigrationsEnabled = true;
                AutomaticMigrationDataLossAllowed = true; // Update-Data -Force (deletes columns etc)
            }
        

        首先要在远程服务器上“启用迁移”,请将其添加到您的 Global.asax.cs 文件中:

                protected void Application_Start()
            {
                ....
                System.Data.Entity.Database.SetInitializer(new MigrateDatabaseToLatestVersion<dbContext, Migrations.Configuration>());
        

        【讨论】:

        • 请注意,在某些版本的 EF 中,这可能会导致数据丢失。有一些版本的 EF,在列重命名的情况下,删除旧列并创建新列。当您应用您的代码(尤其是“DataLossAllowed = true”部分)时,您最终会丢失数据。
        【解决方案7】:

        一个简单的解决方案:从本地包管理器控制台运行Update-Database,提供一个连接字符串参数和生产连接字符串。您还必须提供连接提供程序名称(本示例代码中的 SqlServer):

        Update-Database -ConnectionString <your real remote server connection string here> -ConnectionProviderName System.Data.SqlClient
        

        您可以使用 app.config 文件 connectionStrings 部分中存在的连接字符串名称来代替连接字符串:

        Update-Database -ConnectionStringName <your connection string name here>
        

        您必须具有从本地计算机访问该服务器的权限。例如,如果您能够从 Sql Server Management Studio 连接到服务器,则可以使用它。

        请注意,不建议将此方法用于实际生产系统,您应该使用类似于已接受答案中解释的方法。但它可以帮助您快速开发远程服务器、测试环境等。

        【讨论】:

        • 应该是“System.Data.SqlClient”,作为字符串,连接字符串显然也是字符串。谢谢! :)
        猜你喜欢
        • 1970-01-01
        • 2017-02-09
        • 2016-10-18
        • 1970-01-01
        • 2014-05-07
        • 2014-10-16
        • 2018-03-23
        • 1970-01-01
        • 2021-04-19
        相关资源
        最近更新 更多