1

現在、私は EF6 Alpha を使用しています。移行を使用すると、新しい移行ログが __MigrationHistory テーブルに追加されます。

EF6 では、__MigrationHistory テーブルに "ContextKey" という新しい列があります。テストの結果、デフォルトの「ContextKey」値が 2 つあることがわかりました。

  1. DbContext の派生クラスの完全な名前。これは、コードを実行すると発生します。

    Database.CreateIfNotExists();
    
  2. DbMigrationsConfiguration の派生クラスの完全な名前。これは、コードを実行すると発生します:

    public ArticleDbContext()
    {   
        Database.SetInitializer(new MigrateDatabaseToLatestVersion<ArticleDbContext, ArticleConfiguration>());
    }
    

初めてアプリケーションを実行すると、「Database.CreateIfNotExists();」私のために新しいデータベースを作成し、ArticleDbContext で定義されたモデルにマップするすべてのテーブルも作成し、ContextKey の値が「Module.Article.Model.ArticleDbContext」である __MigrationHistory 行を追加します。

そして、「Database.SetInitializer(new MigrateDatabaseToLatestVersion());」このコードが実行されると、新しい ContextKey "PowerEasy.Module.Article.Migrations.ArticleConfiguration" が生成されます。移行は、この ContextKey を使用して __MigrationHistory テーブルをクエリし、データがないことを確認します。したがって、ArticleDbContext で定義されたモデルにマップされるすべてのテーブルが作成されますが、テーブルはデータベースに既に存在するため、例外がスローされ、「テーブル XXX は既に存在しています」と通知されます。

どうすればこれを解決できますか?

4

1 に答える 1

5

MigrationsとDatabase.CreateIfNotExistsメソッド(またはその上に構築されたイニシャライザー)を混在させないでください。データベースがまだ存在しない場合は、移行によってデータベースの作成が処理されます。

Migrationsイニシャライザの代わりに、DbMigrator.Updateメソッドを使用して移行を適用することもできます。これは、初期化子によってトリガーされる前にデータベースを作成/更新する場合に役立ちます。

于 2012-11-14T17:21:04.433 に答える