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 に答える