6

У меня возникли трудности с получением двух моих контекстов, которые используют одну и ту же базу данных для сотрудничества. Вот сценарий:MVC/Entity Code-First Несколько контекстов с ссылочной целостностью между ними

В приложении MVC с использованием EF 6 Code-First есть одна база данных с двумя контекстами. - Первый контекст - это контекст ApplicationIdentity с настраиваемым объектом ApplicationUser. - Второй контекст является бизнес-контекстом, который держит модель команды:

public class Team 
{ 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public int Id { get; set; } 

    public ApplicationUser TeamLeader { get; set; } 

    public string Name { get; set; } 

    public virtual ICollection<ApplicationUser> TeamMembers { get; set; } 

    public bool IsActive { get; set; } 
} 

Управления миграции было трудно, хотя этот ответ оказался чрезвычайно полезным: Multiple DB Contexts in the Same DB and Application in EF 6 and Code First Migrations

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

То, что я хотел бы для следующих правил, которые должны применяться:

  • IdentityContext отвечает за создание и изменение Схему только таблиц идентификаторов. Он не знает об объектах (aka Team) за пределами своей области ответственности.
  • Бизнес-контекст отвечает за ссылочную целостность между его объектами и IdentityObjects, но может не редактировать записи в таблицах Identity. Если пользователь не существует, ошибка не создается.

Есть ли у кого-нибудь советы о том, как заставить эти контексты играть хорошо друг с другом? Я действительно не хочу нарушать ссылочную целостность между объектами Identity и бизнес-объектами.

+0

@Cola не предполагают Bolding случайных слов, что не улучшает читаемость так или иначе. – CodeCaster

ответ

2

Что вы пытаетесь сделать, выглядит как «Ограниченные контексты DDD».

Это немного времени, чтобы объяснить, как их использовать, но вот несколько советов:

  • использование modelBuilder.Ignore<EntityType>(); исключить из своих связанных модельных сущностей, которые автоматически добавляются в контекст
  • используют различные классы в каждой модели, где это необходимо, и сопоставить их соответствующим образом. Я имею в виду классы, которые отображают только часть столбцов. Используйте modelBuilder настроить их
  • использование readonly navigation properties и readonly properties, где необходимо

Это очень интересный пост Джули Лерман: Data Points - Shrink EF Models with DDD Bounded Contexts

+0

Так что я немного поработал с этим. Операторы ignore в бизнес-контексте отлично подходят для того, чтобы миграция не пыталась изменить схемы идентификации, но теперь она полностью игнорирует их. Он должен по-прежнему делать внешние ключи. Я пробовал делать context.Entity . HasMany (u => u.TeamMembers), и при попытке сделать новую миграцию он выдает ошибку, потому что тип игнорируется. Мне нужен способ рассказать о моем бизнес-контексте («Существует таблица пользователей. Нет, вы не можете ее изменить. Да, вы можете использовать для этого внешние ключи, и да, вы должны знать об этом».) –

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