实体框架自动迁移多个上下文

时间:2012-09-05 12:30:35

标签: entity-framework

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

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

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命令搭建了一个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");
    }
}

所以我的问题是实体框架是否支持使用初始化程序进行多个上下文的迁移?如果没有,那么当可以针对多个上下文处理迁移时,这将是一个很好的功能。

2 个答案:

答案 0 :(得分: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...

现在唯一的缺点是我必须在包管理器控制台中切换项目......

答案 1 :(得分:2)

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

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