Отображение FluentNH «глубокой» реляционной модели на «сплющенный» доменный объект - PullRequest
0 голосов
/ 18 ноября 2010

Вот история: сайт (физическое местоположение интереса) имеет ноль или более контактов.Этими контактами являются люди, связанные с Компанией, которые уполномочены заниматься вопросами, касающимися Сайта.

Схема выглядит следующим образом:

Person -< CompanyContact -< CompanySiteContact >- Site
  ||
  | -< PersonPhone
  |
   -< PersonAddress

Моя точка входа - Сайт.Мне нужен список контактов.Очень мало интересующих вас полевых данных, пока вы не доберетесь до Person.Итак, я хотел бы объединить Person, CompanyContact и CompanySiteContact в один класс домена.

Доступные варианты:

  • Создать один класс домена ииспользуйте объединения в карте FluentNH, чтобы сгладить слои при получении данных.Это никогда не звучало просто, и у меня возникают проблемы с многоуровневым соединением (если A присоединяется к B, присоединяется к C, вы не можете указать соединение с C в соединении с B).Тем не менее, я думаю, что, если возможно указать объединения, это будет единовременным решением, и в итоге это будет наиболее приемлемым решением.

  • Воспроизведите глубокую модель внабор "DTO", которые отображают 1: 1 в таблицы и могут быть переданы в конструктор "плоской" модели домена.Это работает, но похоже на читерство (нет проблемы, которую нельзя решить с помощью другого уровня абстракции, за исключением слишком большого количества уровней абстракции), и мой инстинкт подсказывает мне, что это в конечном итоге вызовет больше проблем, чем решит.

  • Реплицируйте модель домена 1: 1 со схемой и используйте сквозные свойства в CompanySiteContact для доступа к свойствам в недрах записи Person.Опять же, работает сейчас, но на самом деле это не решает проблему, и каждое новое свойство, которое становится интересным, потребует изменений в отображении, фактическом классе домена И классе домена верхнего уровня.Не очень твердое тело.

Итак, вопрос в том, как мне структурировать отображение?Как я уже сказал, я не могу указать соединение в соединении.Я думаю, что мне нужно сделать это - сопоставить PK каждой таблицы и использовать его в следующем соединении с верхнего уровня, но я не совсем уверен, как это настроить (не использовал FluentNH для настройкичто-нибудь близкое к этому комплексу раньше).

Ответы [ 2 ]

2 голосов
/ 18 ноября 2010

Я бы рекомендовал создать модель вашего домена, чтобы она точно соответствовала вашей базе данных.Оттуда я буду создавать DTO и использовать AutoMapper для выравнивания.Легко.

0 голосов
/ 06 декабря 2010

Спасибо Джеймсу за ответ; +1, но я не думаю, что AutoMapper необходим на данном этапе, и я немного обеспокоен тем, что включаю что-то, что делает эту работу довольно "автоматически". Я подумал о еще нескольких вариантах:

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

  • Сопоставьте мой домен 1: 1, как предложил Джеймс, но затем используйте запрос Linq, чтобы объединить модель в DTO. Этот запрос может быть инкапсулирован в помощнике репозитория, что позволяет разработчикам запрашивать DTO напрямую, используя те же методы в репозитории, что и для других классов. Это сложнее, чем представление с тем же результатом, но не требует изменений схемы.

Я, вероятно, пойду с первым вариантом и прибегну ко второму при необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...