ASP.NET MVC 4,迁移 - 如何在生产服务器上运行“update-database”

时间:2013-06-10 09:10:33

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

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

可能是一个愚蠢的问题,但我无法在线找到 - 一旦部署了我的网站 - 我该如何在服务器上手动运行?

其次 - 您建议将数据库迁移部署到生产中的其他策略 - 以及它们如何更适合?

由于

7 个答案:

答案 0 :(得分:29)

您有几个选择:

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

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

enter image description here

答案 1 :(得分:9)

我知道这个问题已经得到解答,但供将来参考:

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

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

答案 2 :(得分:4)

对我们而言,DBA是唯一可以访问生产(和预生产)环境的组。我们只需使用Update-Database -Script package console命令获取更新数据库所需的Sql。这可以传递给他们,以便他们可以验证它等等。

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

HTH。

答案 3 :(得分:2)

一个简单的解决方案:从本地程序包管理器控制台运行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连接到服务器,则可以使用它。

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

答案 4 :(得分:1)

我个人喜欢设置每次调用应用程序的start方法时运行的自动迁移。这样,您进行的每次部署都可以运行并自动更新应用程序。

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

要点基本上是要启用自动迁移,然后从代码中调用DatabaseInitializer,可以是OnModelCreating方法,也可以是Global.asax。

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

只是为每个人提供简单的答案。

这是“更新数据库” 在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>());