2017-04-24 58 views
0

我正在開發每個版本(更新視圖,添加/刪除列)之間的數據庫架構可能不同的窗口應用程序。因此,我正在尋找讓應用程序在客戶端計算機上啓動時EF更新架構的方式。我讀了一些文章,但他們指向包管理器命令Add-Migration, Update-Database,我不能在我的情況下使用。 我使用了存儲庫模式,所以當我嘗試Database.SetInitializer<C>(new MigrateDatabaseToLatestVersion<C, Configuration<C>>()); 我得到無法更新數據庫以匹配當前模型,因爲有掛起的更改,並且自動遷移被禁用。將掛起的模型更改寫入基於代碼的遷移或啓用自動遷移。將DbMigrationsConfiguration.AutomaticMigrationsEnabled設置爲true以啓用自動遷移。異常 但是,當我設置AutomaticMigrationsEnabled = true;我得到了另一個錯誤:表''表名'已經存在。使用實體框架代碼首先遷移來更新應用程序啓動時的數據庫架構

+0

請參閱[這裏](http://stackoverflow.com/questions/35144784/how-to-use-migration-programmatically-in-entityframework-codefirst)和[這裏](https://romiller.com/2012/02/09/running-scripting-migrations-from-code /) –

+0

我已閱讀並嘗試以上但未成功,我更新了我的問題以獲取更多詳細信息@SteveGreene –

+0

聽起來像您沒有正確配置遷移。您需要進行初始基線遷移「添加遷移MyBaseline -IgnoreChanges」。然後,爲隨後的更改正常添加遷移。 –

回答

0

我找到了一個解決辦法是創建一個擴展方法

public static void RunMigration(this DbContext context, DbMigration migration) 
    { 
     var prop = migration.GetType().GetProperty("Operations", BindingFlags.NonPublic | BindingFlags.Instance); 
     if (prop != null) 
     { 
      IEnumerable<MigrationOperation> operations = prop.GetValue(migration) as IEnumerable<MigrationOperation>; 
      var generator = new SqlServerMigrationSqlGenerator(); 
      var statements = generator.Generate(operations, "2008"); 
      foreach (MigrationStatement item in statements) 
       context.Database.ExecuteSqlCommand(item.Sql); 
     } 
    } 

然後創建類MyMigration它繼承DbMigration像正常遷移,而當應用程序啓動,我會檢查,並迫使它象下面這樣運行:

var myMigration = new MyMigration(); 
myMigration.Up(); 
this.RunMigration(myMigration); 
相關問題