2017-04-24 4 views
0

DBスキーマがリリースごとに異なる(更新ビュー、追加/削除列)ウィンドウアプリケーションを開発しています。したがって、アプリケーションがクライアントマシンで起動するときに、EFがスキーマを更新できるようにする方法を探しています。私はいくつかの記事を読んでいますが、彼らは私の場合は使用できないパッケージマネージャーコマンドAdd-Migration, Update-Databaseを指しています。 私は試したときにリポジトリパターンを使用しましたDatabase.SetInitializer<C>(new MigrateDatabaseToLatestVersion<C, Configuration<C>>()); 私にはが保留中の変更があり、自動移行が無効になっているため、現在のモデルと一致するようにデータベースを更新できません。保留中のモデル変更をコードベースの移行に書き込むか、自動移行を有効にします。自動移行を有効にするには、DbMigrationsConfiguration.AutomaticMigrationsEnabledをtrueに設定します。例外 しかし、AutomaticMigrationsEnabled = true;を設定すると、別のエラーが発生します。テーブル 'TableName'は既に存在します。Entity Frameworkコード一次移行を使用してアプリケーション起動時にDBスキーマを更新する

+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

マイグレーションが正しく設定されていないようです。最初のベースライン移行「Add-Migration 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); 
     } 
    } 

を作成し、通常の移行のようなDbMigrationを継承したクラスMyMigrationを作成し、回避策を発見し、アプリケーションが起動したとき、私はチェックして、以下のように実行することを強制します:

var myMigration = new MyMigration(); 
myMigration.Up(); 
this.RunMigration(myMigration); 
関連する問題