【问题标题】:Triggering EF migration at application startup by code通过代码在应用程序启动时触发 EF 迁移
【发布时间】:2011-12-14 16:47:27
【问题描述】:

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

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

这可能吗?文档稀缺。

【问题讨论】:

    标签: migration entity-framework-4.1 entity-framework-migrations


    【解决方案1】:

    直到 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);        
    

    【讨论】:

    • 请注意,这已经过时了,EF 4.3 的 RTM 包含一个名为 MigrateDatabaseToLatestVersion 的新数据库初始化程序。请参阅stackoverflow.com/questions/9281423/… 了解更多信息。
    • 虽然在上下文构造函数中设置初始化器似乎会干扰 powershell 脚本。我已经恢复使用带有上述代码的 app_start 模块。
    【解决方案2】:

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

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

    到您的Global.asax Application_Start 方法。

    【讨论】:

      猜你喜欢
      • 2021-12-31
      • 2017-07-30
      • 2012-09-15
      • 1970-01-01
      • 1970-01-01
      • 2015-12-18
      • 1970-01-01
      • 2015-10-21
      • 2013-04-09
      相关资源
      最近更新 更多