我可以使用包管理器在本地运行'update-database -verbose'。
可能是一个愚蠢的问题,但我无法在线找到 - 一旦部署了我的网站 - 我该如何在服务器上手动运行?
其次 - 您建议将数据库迁移部署到生产中的其他策略 - 以及它们如何更适合?
由于
答案 0 :(得分:29)
您有几个选择:
update-database -script
生成SQL命令来更新服务器上的数据库/packages/EntityFramework5.0.0/tools/migrate.exe
上的包文件夹中的migrate.exe可执行文件。我过去曾使用Jet Brains的Team City Build Server成功地使用它来设置我的部署脚本的迁移。更新另外,请查看Sayed Ibrahim's blog,他在Microsoft的MsBuild团队工作并对部署有一些很好的见解
答案 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>());