13

プロジェクトでEntityFramework4.3Migrationsを利用しています。ドメインオブジェクトとコンテキストクラスに変更を加えたときに、プロジェクトの実行時にデータベースが自動的に更新されるように、自動移行を使用したいと思います。私はこれまでこれを機能させています。

自動移行に加えて、いくつかの追加された移行も使用したいと思います。また、アプリケーションを実行すると、アプリケーションが(追加された移行に基づいて)最新バージョンに自動的にジャンプするようにします。

これを行うために、これをglobal.asaxファイルに配置しました...

Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyContext, Core.Migrations.Configuration>());

これで機能しますが、これを行うと、ドメインオブジェクトに基づいてデータベースが自動的に更新されなくなります。

データベースを完全に削除してからアプリケーションを実行し、すべての自動移行を実行してから、明示的な移行を実行してデータベースを最新バージョンにすることができるようにしたいと思います。

以前のプロジェクトでこれが機能していたことは知っていますが、この場合に何が間違っているのかわかりません。

ありがとう

4

6 に答える 6

12

コンストラクターで AutomaticMigrationsEnabled を true に設定した構成を渡す必要があります。このようなものが役立つはずです:


Database.SetInitializer(new MigrateDatabaseToLatestVersion<MyContext, MyConfiguration>());

MyConfiguration は次のようになります。


public class MyConfiguration : Core.Migrations.Configuration
{
    public MyConfiguration { this.AutomaticMigrationsEnabled = true; }
}

免責事項:これをハッキングしただけなので、これをコンパイルするには小さな調整が必要になる場合があります

編集:

EF 4.3.1 で確認したところ、初期化子のコードは次のようになります。

Database.SetInitializer(new MigrateDatabaseToLatestVersion<DataContext, MyConfiguration>());

そしてこれは構成クラスの場合:

public class MyConfiguration : System.Data.Entity.Migrations.DbMigrationsConfiguration<DataContext>
{
    public MyConfiguration()
    {
        this.AutomaticMigrationsEnabled = true;
    }
}
于 2012-05-18T11:31:31.933 に答える
7

これについて数時間頭を悩ませた後、必要に応じてデータベースを作成するか、古い場合はアップグレードするソリューションをついに思いつきました。Gallery Server Pro ではこの手法を使用して、初回のインストールや以前のバージョンのアップグレードを容易にしています。

private static void InitializeDataStore()
{
  System.Data.Entity.Database.SetInitializer(new System.Data.Entity.MigrateDatabaseToLatestVersion<GalleryDb, GalleryDbMigrationConfiguration>());

  var configuration = new GalleryDbMigrationConfiguration();
  var migrator = new System.Data.Entity.Migrations.DbMigrator(configuration);
  if (migrator.GetPendingMigrations().Any())
  {
    migrator.Update();
  }
}

public sealed class GalleryDbMigrationConfiguration : DbMigrationsConfiguration<GalleryDb>
{
  protected override void Seed(GalleryDb ctx)
  {
    MigrateController.ApplyDbUpdates();
  }
}

詳細については、ブログ投稿を作成しました: Using Entity Framework Code First Migrations to auto-create and auto update an application

于 2013-10-21T20:39:00.170 に答える
1

これが私の現在の解決策ですが、完全には満足していません。

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();

    RegisterGlobalFilters(GlobalFilters.Filters);
    RegisterRoutes(RouteTable.Routes);

    var context = new KCSoccerDataContext();
    var initializeDomain = new CreateDatabaseIfNotExists<KCSoccerDataContext>();
    var initializeMigrations = new MigrateDatabaseToLatestVersion<KCSoccerDataContext, Core.Migrations.Configuration>();

    initializeDomain.InitializeDatabase(context);
    initializeMigrations.InitializeDatabase(context);

}

私は実際に2つの異なるイニシャライザを作成しています。1 つ目は、CreateDatabaseIfNotExists を使用して、Domain オブジェクトに基づいてテーブルを正常に作成します。2 つ目は、MigrateDatabaseToLatestVersion を使用して、すべての明示的な移行を実行します。

自動移行は基本的に無効になっているため、好きではありません。したがって、ドメイン モデルを追加または変更するには、データベースを完全に削除して再作成する必要があります。アプリケーションを本番環境に移行すると、これは受け入れられなくなります。

于 2012-05-19T14:51:19.673 に答える
-1

あなたはただする必要があります

    private static void InitializeDataStore()
    {
        System.Data.Entity.Database.SetInitializer(new System.Data.Entity.MigrateDatabaseToLatestVersion<GalleryDb, GalleryDbMigrationConfiguration>());
        System.Data.Entity.Database.Initialize(false);
    }
于 2017-07-06T19:42:35.380 に答える