1

2 つのデータベースがあります。dbcontext の 1 つに変更を加える (新しい DbSet を追加する) と、Web アプリケーションを実行するときに正しいデータベースに変更が自動的に適用されます。したがって、新しいテーブルを追加する必要があります。したがって、2 つの構成クラスを追加しました。データベース/コンテキストごとに 1 つ。

ただし、以下のような初期化子を使用すると、変更は常に 2 番目のコンテキスト/データベースに適用されます。これは、構成された最新の初期化子であるためです。

Database.SetInitializer(new MigrateDatabaseToLatestVersion<DomainReadModelContext, DomainConfiguration>());
Database.SetInitializer(new MigrateDatabaseToLatestVersion<WebsiteReadModelContext, WebsiteConfiguration>());

web.configでも試しました

<contexts>
  <context type="Domain.ReadModels.DomainReadModelContext, Domain.ReadModels">
    <databaseInitializer type="System.Data.Entity.MigrateDatabaseToLatestVersion`2[[Domain.ReadModels.DomainReadModelContext, Domain.ReadModels], [Website.Migrations.Domain.DomainConfiguration, Website-WebAppMainModule, Version=1.0.0.0, Culture=neutral]], EntityFramework" />
  </context>
  <context type="Website.ReadModels.WebsiteReadModelContext, Website.ReadModels">
    <databaseInitializer type="System.Data.Entity.MigrateDatabaseToLatestVersion`2[[Website.ReadModels.WebsiteReadModelContext, Website.ReadModels], [Website.Migrations.Website.WebsiteConfiguration, Website-WebAppMainModule, Version=1.0.0.0, Culture=neutral]], EntityFramework" />
  </context>
</contexts

パッケージマネージャーを介して変更を適用すると、正常に機能します。テーブルが domaincontext データベースに追加されます。

Update-Database -config DomainConfiguration

これはサポートされていないためですか、それとも間違っていますか? 現在、登録されている最新の初期化子に対してのみ機能するようです。

更新のために、パッケージ マネージャーで Add-Migration コマンドを使用して移行をスキャフォールディングしました。

Add-Migration AddUniquePersonReadModelMigration -config DomainConfiguration

これにより、次のクラスが生成されました。

public partial class AddUniquePersonReadModelMigration : DbMigration
{
    public override void Up()
    {
        CreateTable(
            "UniquePersonReadModels",
            c => new
                {
                    Id = c.Guid(nullable: false, identity: true),
                    PersonId = c.Guid(nullable: false),
                    DisplayName = c.String(maxLength: 128),
                })
            .PrimaryKey(t => t.Id)
            .Index(p => p.PersonId)
            .Index(p => p.DisplayName, true);
    }

    public override void Down()
    {
        DropIndex("UniquePersonReadModels", new[] { "PersonId" });
        DropIndex("UniquePersonReadModels", new[] { "DisplayName" });
        DropTable("UniquePersonReadModels");
    }
}

私の質問は、エンティティ フレームワークは初期化子を使用した複数のコンテキストの移行をサポートしていますか? そうでない場合は、移行を複数のコンテキストで処理できる場合に便利な機能です。

4

2 に答える 2

3

移行フォルダを自分のWebサイトから別のアセンブリに移動することで、問題を解決しました。

したがって、次の代わりに:

Solution/
    DomainReadModels/
        DomainContext.cs
        Classes........
    WebsiteReadModels/
        WebsiteContext.cs
        Classes........
    Website/
        Migration/
            AddSomeTableToDomainMigration.cs
            AddSomeTableToWebsiteMigration.cs
            WebsiteReadModelsConfiguration.cs
            DomainReadModelsConfiguration.cs
        Websitefiles...

ソリューションを次のように変更しました:

Solution/
    DomainReadModels/
        Migration/
            DomainReadModelsConfiguration.cs
            AddSomeTableToDomainMigration.cs
        DomainContext.cs
        Classes........
    WebsiteReadModels/
        Migration/
            AddSomeTableToWebsiteMigration.cs
            WebsiteReadModelsConfiguration.cs
        WebsiteContext.cs
        Classes........
    Website/
        Websitefiles...

現在、唯一の欠点は、パッケージマネージャーコンソールでプロジェクトを切り替える必要があることです...

于 2012-09-07T15:21:22.350 に答える
2

私があなたの質問を正しく理解している場合、あなたは2つのコンテキストDomainReadModelContextWebsiteReadModelContext使用しており、これらのコンテキストはそれぞれ異なるデータベースを使用しています。この場合、コンテキストごとにイニシャライザーを設定でき、そのコンテキストが特定のデータベースに対して初めて使用されるときに実行されます。つまり、の初期化子は、ドメインモデルデータベースに対してDomainReadModelContext 最初に使用されるときに実行され、の初期化子は、ドメインモデルデータベースに対して最初に使用されるときに実行されます。DomainReadModelContextWebsiteReadModelContextWebsiteReadModelContext

両方のコンテキストが同じデータベースを使用している場合、これは機能しません。同じデータベースにアクセスする複数のコンテキストでの移行の使用はEF5ではサポートされていませんが、EF6で作業中です。

于 2012-09-06T17:10:52.047 に答える