1

我有两个数据库。当我对我的一个 dbcontext 进行更改(添加一个新的 DbSet)时,它应该在运行我的 web 应用程序时自动将更改应用到正确的数据库。所以应该添加新表。因此我添加了两个配置类。每个数据库/上下文一个。

但是,使用下面这样的初始化程序,更改总是应用于第二个上下文/数据库。因为这是配置的最新初始化程序。

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

通过包管理器应用更改时,它可以正常工作。该表被添加到我的域上下文数据库中。

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

我通过将 Migration 文件夹从我的网站移动到单独的程序集解决了这个问题。

因此,而不是以下内容:

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

如果我正确理解了您的问题,那么您正在使用两个上下文DomainReadModelContextWebsiteReadModelContext并且每个上下文都使用不同的数据库。如果是这种情况,那么您当然可以为每个上下文都有一个初始化程序,并且它将在第一次针对给定数据库使用该上下文时运行。换句话说,初始化器 forDomainReadModelContext 将在第一次DomainReadModelContext用于域模型数据库时运行,而初始化器 forWebsiteReadModelContext将在第一次WebsiteReadModelContext用于域模型数据库时运行。

如果两个上下文都使用同一个数据库,那么这将不起作用。EF5 不支持对访问同一数据库的多个上下文使用迁移,但我们正在为 EF6 开发它。

于 2012-09-06T17:10:52.047 回答