NHibernate set mapping не СУХОЙ? - PullRequest
1 голос
/ 12 марта 2009

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

Рассмотрим класс:

public class House
{
    public int Id { get; set; }

public ISet<Room> Rooms
{
    get;
    set;
}

}

При указании элемента NHibernate Set недостаточно написать:

<set name="Rooms" />

Вместо этого я должен написать как минимум:

<set name="Rooms">
  <key column="RoomId"/>
  <one-to-many class="Room"/>
</set>

Кажется, это нарушение принципа СУХОЙ. Если это Set, по умолчанию должно быть отношение один ко многим. Класс должен быть выведен из универсального типа коллекции, и в качестве ключевого столбца должен использоваться первичный ключ класса элемента коллекции.

Мне кажется, это разумные значения по умолчанию. Почему тогда NHiberbate не умен, и требует, чтобы я набрал эти 3 дополнительные строки?

Ответы [ 3 ]

1 голос
/ 14 февраля 2010

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

Не забывайте, это объект для реляционного картографа. Вам понадобится хотя бы один из дополнительных узлов (ключ), чтобы сообщить ему, с каким ключом БД он должен работать. Это позволяет вам быть настолько гибким, насколько вы хотите при отображении в БД, и не быть подключенным к стандартному.

Это сломает СУХОЙ? Возможно. Я забочусь в этом случае? Нет, не совсем.

0 голосов
/ 12 марта 2009

Что делать, если вы не используете универсальную коллекцию? Если я не ошибаюсь, NHibernate поддерживает только дженерики начиная с версии 1.2; поэтому в предыдущих версиях вывод типа был определенно невозможен.

Что если вы используете устаревшую БД, в которой первичный идентификатор не используется в качестве внешнего ключа в связанной таблице?

0 голосов
/ 12 марта 2009

Вы можете взглянуть на Свободный NHibnernate . Их DSL вдохновлен DRY.

Edit: Извините, что должен был прочитать более внимательно ...

Что касается вашего примера, Fluent NHibernate позволит вам выразить отображение как:

HasMany(x => x.Rooms);

Однако отношение HasMany (или «Один ко многим») сопоставляется с IList. Я не уверен, что это может быть настроено дальше (пусть Fluent сопоставляется с ISet по умолчанию). Но в любом случае оно менее повторяется, чем стандартное объявление отображения.

Вот несколько примеров объявления сопоставлений: Свободное владение NHibernate Wiki .

...