0

エンティティ フレームワークを自動移行で動作させる方法が少しわかりません。私が欲しい:

  • 存在しない場合に自動的に作成されるデータベース
  • 機種変更時に自動更新するデータベース

後者については、DbMigrator を使用しています。かなり遅いので、リクエストごとに実行したくありません。また、同じアプリケーションに複数のデータベースがあるため、Application_Start に入れることができないため、次のように Session_Start に入れます。

    if (Session["started"] == null)
    {
        // this takes care of any database updates that might be necessary. 
        MigrationConfiguration configuration = new MigrationConfiguration();
        DbMigrator migrator = new DbMigrator(configuration);
        List<string> pm = migrator.GetPendingMigrations().ToList();
        if (pm.Count > 0)
        {
            migrator.Update();
        }
    }
    else
    {
        Session["started"] = "started";
    }

これが正しい方法かどうかはわかりませんが、機能しているように見えますが、データベースが存在しない場合、実際にはデータベースを生成しません。「ログインによって要求されたデータベース「db」を開けません」というメッセージが表示されます

以前は次のように機能していました。

    Database.SetInitializer<DbContext>(new InitializerIfModelChange());

これはデータベースを削除し、データベースが存在しない場合に適したシード データを生成しますが、データベースが変更された場合にもトリガーされます (この場合、DbMigrator で処理する必要があります)。これは前に Application_Start にありましたが、よくわかりませんそれをどうするか。DbMigrator と競合するのではないかと心配しています。前述の 2 つのことを達成するには、どのように設定すればよいでしょうか?

4

1 に答える 1

1

Update-Databaseデータベースを変更する必要があるときはいつでも、パッケージ マネージャーで手動で実行します。最初はDatabase.SetInitializerあなたがデータベースを作成するのと同じように使用しましたが、今はコメントアウトしています。

より高度なヘルプについては、Entity Framework 4.3 自動移行のチュートリアルをご覧ください

これはあなたが望むように機能するはずです。新しいデータベースを作成する必要があるDatabase.SetInitializer<NewDBContext>(new NewDBInitializer());場合は、以前と同じように追加し、ビルドして実行してください。次に、モデルの変更時に将来実行されないようにコメントアウトし、代わりUpdate-Databaseにパッケージマネージャーでコマンドを使用します。

于 2012-07-07T10:12:41.950 に答える