2012-09-05 50 views
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 

當通過它的作品,因爲它應該是包管理器應用更改。該表被添加到我的domaincontext數據庫。

Update-Database -config DomainConfiguration 

這是因爲這不被支持或我做錯了嗎?現在它似乎只適用於註冊的最新初始化程序。

對於更新,我使用包管理器中的添加遷移命令搭建了遷移。

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"); 
    } 
} 

所以我的問題是實體框架是否支持使用初始值設定項的多個上下文的遷移?如果不是,那麼當遷移可以爲多個上下文處理時,這將是一個很好的功能。

回答

3

我已經通過從我的網站上移動遷移文件夾來分開程序集來解決這個問題。

所以不是以下內容:

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... 

現在,唯一的缺點是我必須切換項目包管理器控制檯...

2

如果我正確理解你的問題,你正在使用兩個上下文DomainReadModelContextWebsiteReadModelContext,並且每個上下文使用不同的數據庫。如果是這種情況,那麼您肯定可以爲每個上下文創建一個初始化程序,並且它將在第一次針對給定數據庫使用該上下文時運行。換言之,DomainReadModelContext的初始化程序將在第一次運行DomainReadModelContext用於域模型數據庫,並且WebsiteReadModelContext的初始化程序將在WebsiteReadModelContext首次用於域模型數據庫時運行。

如果兩個上下文都使用相同的數據庫,那麼這將不起作用。在EF5中不支持使用Migrations訪問同一數據庫的多個上下文,但我們正在爲EF6開發它。

+0

我正在使用不同的數據庫。設置兩個初始值設定項,但不知何故該表被添加到我的websiteReadmodelContext,它應該被添加到domainreadmodelcontext數據庫。 –

+0

初始化器在App_start global.asax中設置。網站首先訪問websiteReadmodelContext ...Domainreadmodelcontext僅在進行更改時才被觸發 –

+0

然後,這聽起來像是一個錯誤。如果你可以創建一個repro,並在CodePlex上提交一個bug(http://entityframework.codeplex.com/workitem/list/basic),那很好。 –