6

使用 Entity Framework Migrations (Beta1),在开发过程中使用 Update-Database 命令都很好。

但是当应用程序在某个客户的服务器上运行时,我真的希望我的应用程序在启动时自动将其数据库模式更新到最新版本。

这可能吗?文档稀缺。

4

2 回答 2

14

他们直到 RTM 才提供这样做的方法,此时他们已经承诺提供命令行应用程序和 msdeploy 提供程序。来源:http: //blogs.msdn.com/b/adonet/archive/2011/11/29/code-first-migrations-beta-1-released.aspx

当然对此不满意,powershell 命令存储在 packages 目录中并且是纯文本,它似乎只是加载了存储在同一目录中的名为 EntityFramework.Migrations.Commands 的程序集。

跟踪该程序集,我想出了以下内容

public class MyContext : DbContext
{
  static MyContext()
  {
    DbMigrationsConfiguration configuration = new DbMigrationsConfiguration() {
      MigrationsAssembly = typeof(MyContext).Assembly,
      ContextType = typeof(MyContext),
      AutomaticMigrationsEnabled = true,                
    };

    DbMigrator dbMigrator = new DbMigrator(configuration);          
    dbMigrator.Update(null);            
  }
}

更新:经过一些实验,我想出了更多的东西

  • 在静态构造函数中为您的上下文执行更新是不好的,因为它会破坏 powershell 命令,最好以另一种方式(Global.asax、WebActivator 或 Main 方法)将代码添加到应用程序启动
  • 上述代码仅在使用 AutomaticMigrations 时有效,您需要设置 MigrationsNamespace 以使其在手动创建的迁移中拾取
  • 我正在创建的配置类应该已经存在于您的项目中(在安装迁移 nuget 包时添加),因此只需实例化它即可。

这意味着代码被简化为

DbMigrator dbMigrator = new DbMigrator(new NAMESPACE.TO.MIGRATIONS.Configuration());
dbMigrator.Update(null);        
于 2011-12-15T07:39:31.650 回答
7

此问题的另一个选项是添加

Database.SetInitializer<MyContext>(new MigrateDatabaseToLatestVersion<MyContext, NAMESPACE.TO.MIGRATIONS.Configuration>());

符合您的Global.asax Application_Start方法。

于 2015-04-11T10:47:49.620 回答