我可以使用包管理器在本地运行“update-database -verbose”。
可能是一个愚蠢的问题,但我无法在网上找到它——一旦我的网站被部署——我如何在服务器上手动运行它?
其次 - 您会推荐哪些其他策略来将数据库迁移部署到生产环境 - 以及它们如何更可取?
谢谢
我可以使用包管理器在本地运行“update-database -verbose”。
可能是一个愚蠢的问题,但我无法在网上找到它——一旦我的网站被部署——我如何在服务器上手动运行它?
其次 - 您会推荐哪些其他策略来将数据库迁移部署到生产环境 - 以及它们如何更可取?
谢谢
你有几个选择:
update-database -script
生成 SQL 命令来更新服务器上的数据库/packages/EntityFramework5.0.0/tools/migrate.exe
. 过去,我已经成功地将它与 Jet Brains 的 Team City Build Server 一起使用,以使用我的部署脚本设置迁移。更新:另外,请查看Sayed Ibrahim 的博客,他在 Microsoft 的 MsBuild 团队工作,对部署有一些深刻的见解
我知道这个问题已经回答了,但供将来参考:
一种选择是把这样的东西放在你的数据库上下文类的构造函数中:
public MyDbContext()
{
System.Data.Entity.Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyDbContext, Configuration>());
}
对我们来说,DBA 是唯一可以访问生产(和预生产)环境的群体。我们只是简单的使用Update-Database -Script
package 控制台命令来获取更新数据库所需的 Sql。这被交给他们,他们可以在那里验证它,等等。
对某些人来说可能有点过于简单,但它确实有效。
HTH。
一个简单的解决方案: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 连接到服务器,则可以使用它。
请注意,不建议将此方法用于实际生产系统,您应该使用类似于已接受答案中解释的方法。但它可以帮助您在开发远程服务器、测试环境等方面进行快速破解。
我个人喜欢设置每次调用应用程序的启动方法时运行的自动迁移。这样,每次部署时,您都可以运行迁移并自动更新应用程序。
查看 AppHarbor 的这篇文章。http://blog.appharbor.com/2012/04/24/automatic-migrations-with-entity-framework-4-3
要点基本上是您想要启用自动迁移,然后从您的代码中调用 DatabaseInitializer,无论是从 OnModelCreating 方法还是从您的 Global.asax。
您可以使用 EF 命令 (update-database -script) 获取脚本,也可以手动编写脚本。这不是在生产环境中更新数据库最重要的事情。对我来说,最重要的是确保所有脚本都正确运行并且它们按预期影响了记录。在我看来,你应该有一个预生产环境,数据库应该是生产环境的副本。这样,您可以在非常相似的环境中运行脚本并部署应用程序,看看是否有任何问题。有时脚本在 DEV 环境中可以正确执行,但在生产环境中会失败。为避免头疼,您应该在预生产环境中模拟生产环境。关于剧本,如果团队有多个开发人员,我更喜欢将脚本分类为结构脚本和数据脚本。结构脚本改变数据库的结构(添加表,向表中添加列等),数据脚本插入/更新/删除记录。此外,每个脚本都应指定其依赖项,以便它们不会以错误的顺序执行。在创建表 A 之前,无法执行在表 A 中插入行的数据脚本。这就是我所做的: - 定义一个用于注册已执行脚本的表。例如:ExecutedScriptsHistory。- 每个脚本都有一个编号和一个名称。- 执行脚本后,在表 ExecutedScriptsHistory 中插入新行。- 在执行脚本之前,它会检查其依赖关系。为此,它会检查脚本是否已执行(存在于表 ExecutedScriptsHistory 中)。
运行脚本后,您可以检查是否所有脚本都已执行检查 ExecutedScriptsHistory。此策略类似于 Microsoft 在 EF 迁移中选择的策略,但您可以完全控制它。
只是为了给大家一个简单的答案。
这是迁移文件夹 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>());