30

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

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

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

谢谢

4

7 回答 7

28

你有几个选择:

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

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

在此处输入图像描述

于 2013-06-10T13:20:06.587 回答
10

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

一种选择是把这样的东西放在你的数据库上下文类的构造函数中:

public MyDbContext()
    {
        System.Data.Entity.Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyDbContext, Configuration>());            
    }
于 2015-01-08T00:41:44.693 回答
4

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

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

HTH。

于 2013-06-10T11:14:43.020 回答
3

一个简单的解决方案: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 连接到服务器,则可以使用它。

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

于 2016-11-09T12:49:33.123 回答
1

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

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

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

于 2013-06-10T12:52:43.300 回答
0

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

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

于 2014-06-30T01:34:40.387 回答
0

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

这是迁移文件夹 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>());
于 2016-06-03T01:10:57.933 回答