6

在應用程序啓動時觸發EF遷移使用實體框架遷移(Beta1),使用Update-Database命令在開發過程中都很好。通過代碼

但是,當應用程序在某個客戶的服務器上運行時,我真的希望我的應用程序在啓動時自動將其數據庫架構更新爲最新版本。

這可能嗎?文檔很少。

回答

11

他們沒有提供一種方法來做到這一點,直到RTM,在這一點上他們已經承諾了一個命令行應用程序和msdeploy提供程序。 來源:http://blogs.msdn.com/b/adonet/archive/2011/11/29/code-first-migrations-beta-1-released.aspx

當然不滿足於是,PowerShell命令被保存在包裝目錄是純文本,它似乎只是加載存儲在同一目錄中的裝配稱爲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);    
    } 
} 

UPDATE:有點實驗後,我想通了一些事情

  • 在靜態構造函數執行的更新您的上下文是壞的,因爲它打破了PowerShell命令,更好的應用程序啓動以另一種方式添加代碼(Global.asax,WebActivator或Main方法)
  • 上述代碼僅適用於使用AutomaticMi您需要設置MigrationsNamespace以便在手動創建的遷移中取得
  • 我創建的配置類應該已經存在於您的項目中(在安裝遷移nuget包時添加),因此只需實例化它。

這意味着該代碼被簡化爲

DbMigrator dbMigrator = new DbMigrator(new NAMESPACE.TO.MIGRATIONS.Configuration()); 
dbMigrator.Update(null);   
+3

請注意,這現在已過時,EF 4.3的RTM包含一個名爲MigrateDatabaseToLatestVersion的新數據庫初始化程序。有關更多信息,請參閱http://stackoverflow.com/questions/9281423/entity-framework-4-3-run-migrations-at-application-start。 – Betty 2012-02-18 23:16:48

4

對於此問題的另一個選項是

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

行添加到您的Global.asaxApplication_Start方法。