2012-09-05 2 views
1

У меня есть две базы данных. Когда я вношу изменения в один из моих dbcontext (добавляя новый DbSet), он должен автоматически применять изменения к правильным базам данных при запуске моего веб-приложения. Поэтому следует добавить новую таблицу. Поэтому я добавил два класса конфигурации. Один для каждой базы данных/контекста.Entity Framework Автоматическая миграция нескольких контекстов

Однако использование инициализаторов, подобных приведенным ниже, всегда применяется ко второму контексту/базе данных. Потому что это последний инициализатор настроен.

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

Так что мой вопрос заключается в том, поддерживает ли сущность framework миграции для нескольких контекстов с использованием инициализаторов? В противном случае это была бы приятная функция, когда миграции можно было бы обрабатывать для нескольких контекстов.

ответ

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

Если я правильно понимаю ваш вопрос, вы используете два контекста DomainReadModelContext и WebsiteReadModelContext, и каждый из этих контекстов использует другую базу данных. Если это так, то у вас наверняка есть инициализатор для каждого контекста, и он будет запущен при первом использовании этого контекста для данной базы данных. Другими словами, инициализатор для DomainReadModelContext будет запущен в первый раз, когда DomainReadModelContext используется для базы данных модели домена, а инициализатор для WebsiteReadModelContext будет запущен в первый раз, когда WebsiteReadModelContext будет использоваться в базе данных модели домена.

Если оба контекста используют одну и ту же базу данных, это не сработает. Использование Migrations для нескольких контекстов, которые обращаются к одной базе данных, не поддерживается в EF5, но мы работаем над этим для EF6.

+0

Я использую разные базы данных. Установите оба инициализатора, но каким-то образом таблица добавляется в мой сайтReadmodelContext и его следует добавить в базу данных domainreadmodelcontext. –

+0

инициализаторы установлены в App_start global.asax. Веб-сайт сначала попадает на сайтReadmodelContext ...Domainreadmodelcontext попадает только при внесении изменений –

+0

Тогда это звучит как ошибка. Если бы вы могли создать репродукцию и файл с ошибкой в ​​CodePlex (http://entityframework.codeplex.com/workitem/list/basic), это было бы здорово. –

Смежные вопросы