2015-05-15 3 views
2

В настоящее время у меня есть два DbContexts, ApplicationDbContext и CompanyDBContext. Однако проблема заключается в том, что когда я запускаю свое веб-приложение MVC, только база данных CompanyDBC находит отражение в базе данных, и я не вижу ни одной реализации, сделанной в ApplicationDbContext, отображаемой в базе данных. Оба моих контекста используют одну и ту же строку соединения. ApplicationDbContext был автоматически генерируется, когда я создал мое приложение MVC, как я выбрал Индивидуальные счетаDBContext перезаписывает предыдущую миграцию

В настоящее время ApplicationDbContext выглядит следующим образом

public class ApplicationDbContext : IdentityDbContext<ApplicationUser> 
{ 
    public ApplicationDbContext() 
     : base("DevConnection", throwIfV1Schema: false) 
    { 
    } 

    public static ApplicationDbContext Create() 
    { 
     return new ApplicationDbContext(); 
    } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Ignore<CompanyDetails>(); 
    } 
} 

и вот мой CompanyDbContext

public class CompanyDBContext : DbContext 
{ 

    public CompanyDBContext() : base("DevConnection") 
    { 
    } 

    public DbSet<CompanyDetails> companies { get; set; } 

} 
+1

Может http://www.codeproject.com/Tips/801628/Code-First-Migration-in-Multiple-DbContext бы помочь? – jjj

+0

Итак, для каждой миграции будет создан новый файл конфигурации специально для этого конкретного контекста? – Johnathon64

ответ

1

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

Вы могли бы сделать это с помощью комбинации Database.SetInitializer и явного вызова DbContext.Database.Initialize()

Источники

+0

Вам нужно иметь все dbsets в каждом контексте в пределах одного контекста? Подобно этому http://stackoverflow.com/questions/17246069/multiple-dbcontexts-on-one-db-with-code-first-migrations – Johnathon64

+0

Да, поскольку этот основной контекст будет в основном служить определением базы данных и вашей базой данных будут созданы и перенесены с использованием этого. – jjj

+0

, но разве это не означает, что в других dbContexts не будет много смысла? Извините, я просто пытаюсь понять необходимость, так как контекст, который обрабатывает миграции, делает почти все. – Johnathon64

1

Это походит только один dbContext может быть обновлен в одно мгновение. Вы должны Enable-Migration, Add-Migration и Update-Database для каждого dbContext. Так я это делаю. Но мои dbContext были в разных проектах, так что может быть, это может быть то же самое для вас! Обновление отдельно не перезаписывало мою базу данных. Меня устраивает !

+0

спасибо за ввод, я пробовал это, однако, поскольку они находятся в одном проекте, я не могу включить миграцию для этого единственного dbContext. Когда я пытаюсь, он говорит, что миграция уже включена. Я попытался поместить команду -Force, но ничего не получилось, это не сработало – Johnathon64

+0

Я думаю, что, возможно, я неправильно набрал команды. Я отдам это завтра, и если это сработает, я дам вам тиканье. – Johnathon64

2

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

enable-migrations -ContextTypeName MyCoolContext -MigrationsDirectory MyCoolMigrations 

http://www.mortenanderson.net/code-first-migrations-for-entity-framework

0

In думаю, что проблема у вас есть, то, что ваши таблицы базы данных/миграции не разделены.

В EF6, если вы работаете с более чем одним контекстом, я рекомендую указать имя для схемы по умолчанию в методе OnModelCreating из вас DbContext производного класса (где конфигурация Fluent-API).

public partial class ApplicationDbContext : DbContext 
{ 
    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.HasDefaultSchema("Application"); 

     // Fluent API configuration 
    } 
} 

public partial class CompanyDBContext : DbContext 
{ 
    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.HasDefaultSchema("Company"); 

     // Fluent API configuration 
    } 
} 

Этот пример будет использовать «Application» и «Компания» в качестве префиксов для таблиц базы данных (вместо «DBO») в вашем (один) базы данных. . Более того, он также будет префикс таблицы __MigrationHistory, например. Application.__MigrationHistory и Company.__MigrationHistory. Таким образом, вы можете иметь более одной таблицы __MigrationHistory в одной базе данных, по одному для каждого контекста. Итак, изменения, которые вы делаете для одного контекста, не будут конфликтовать с другим.

При добавлении миграции, указать полное имя вашего класса конфигурации (полученного из DbMigrationsConfiguration) в качестве параметра в команде add-migration:

add-migration NAME_OF_MIGRATION -ConfigurationTypeName FULLY_QUALIFIED_NAME_OF_CONFIGURATION_CLASS 

например,

add-migration NAME_OF_MIGRATION -ConfigurationTypeName ApplicationConfiguration 

если ApplicationConfiguration это имя вашего класса конфигурации.


В таком случае вы также можете работать с различными «Миграция» папки в проецировании. Вы можете настроить свой DbMigrationsConfiguration производный класс, соответственно, используя MigrationsDirectory свойство:

internal sealed class ApplicationConfiguration: DbMigrationsConfiguration<ApplicationDbContext> 
{ 
    public Configuration() 
    { 
     AutomaticMigrationsEnabled = false; 
     MigrationsDirectory = @"Migrations\Application"; 
    } 
} 

internal sealed class CompanyConfiguration : DbMigrationsConfiguration<CompanyDBContext> 
{ 
    public Configuration() 
    { 
     AutomaticMigrationsEnabled = false; 
     MigrationsDirectory = @"Migrations\Company"; 
    } 
} 
Смежные вопросы