2013-02-10 2 views
3

Я архивирую свое приложение на линиях шаблона репозитория, совокупный корень и единицу работы. Я использую Entity Framework5 как ORM.Шаблон репозитория и сводный корневой шаблон и структура Entity Framework

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

Я не уверен, имел ли я смысл с моим предыдущим заявлением, но позвольте мне привести его здесь.

Person Таблица в Db (Это совокупный корень в моем приложении)

  1. Имя
  2. Строка адреса 1
  3. CountryId

Страны таблице (Это не как я мог бы никогда не запрашивать их самостоятельно)

  1. CountryId
  2. Название страны

В моем приложении у меня есть PersonsRepository, который реализует общий репозиторий, где T представляет собой совокупный корень.

Теперь, когда я создаю нового человека в своем коде, мне нужно добавить страну в свойство навигации объекта Person. Если я создаю новый объект страны и присвою его свойству Person's Country и попытаюсь сохранить объект Person, EF выдает ошибку. Я не могу запросить таблицу «Страны», потому что это не мой корень Aggregate.

Ну, это не мой реальный сценарий, но это то, что я пытаюсь преодолеть. Как мне исходить?

Одна мысль, которая приходит мне на ум, заключается в создании универсального репозитория только для чтения, который будет использоваться для запросов к БД и не будет его модифицировать. Это хороший способ продолжения или что-то не так, что я делаю.

Заранее благодарим за ваш ответ и за чтение длинного сообщения.

+0

И какая ошибка EF кидает? –

+0

Он выбрасывает «Невозможно передать объект Person для ввода Country», и я думаю, что это совершенно верно, почему я должен создавать новый объект Country, если он является внешним ключом в db. Он отлично работает. Если я прихожу к стране с помощью datacontext и присваиваю ее объекту Country Property of Person при его создании. –

ответ

5

Совокупные корни - это не просто вещи, которые вам могут не потребоваться напрямую. По вашим соображениям вам придется создавать одну и ту же страну несколько раз, так как вы не можете запросить, выходит ли страна (т. Е. Страна является слабой таблицей, которая требует, чтобы Человек существовал).

Простые корни agreggate - это объекты, которые можно идентифицировать без каких-либо других целей. Страна может существовать без какого-либо лица, в то время как строка заказа не может быть идентифицирована без заказа. Вы можете прочитать эту статью: http://dddcommunity.org/library/vernon_2011

Что касается структуры объекта, проверить мое внедрение хранилища/UOW: http://blog.gauffin.org/2013/01/repository-pattern-done-right/

+0

Спасибо за ответ jgauffin, что очищает мое понимание об агрегатах. –

+1

Статья в репозитории: * «Более реалистичный подход заключается в том, что вы в UserRepository.GetUsersGroupOnSomeComplexQuery() напрямую используете ADO.NET, когда вы в UserRepository.Create() использует Entity Framework.» * Почему я никогда не рассматривал это, приветствия! –

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