2010-01-04 3 views
2

У меня есть класс Rotation, который содержит ссылки на несколько списков объектов Advert. Я предпочел бы реализацию, где Rotation имеет свойство типа List<List<Advert>>, чтобы удержать их, но я не могу придумать отображение NHibernate, поддерживающее это.Как мне отобразить Список <Список <EntityClass>> в NHibernate?

В схеме базы данных, многие-ко-многим соотношение между Rotation и Advert представлена ​​в виде таблицы RotationAdvert со следующими столбцами:

  • RotationID
  • AdvertID
  • Variant ("горизонтальное положение "/ индекс в пределах внешнего списка)
  • Position (" вертикальное положение "/ индекс внутри внутреннего списка)

Лучшее решение, которое я нашел еще, чтобы реализовать фиксированное число List<Advert> типизированных свойств на Rotation и продолжить отображение с <list> элементом для каждого:

<list name="Variant1" table="RotationAdvert" where="Variant = 1"> 
    <key column="RotationID"/> 
    <index column="Position"/> 
    <many-to-many class="Advert" column="AdvertID"/> 
</list> 

<list name="Variant2" table="RotationAdvert" where="Variant = 2"> 
    <key column="RotationID"/> 
    <index column="Position"/> 
    <many-to-many class="Advert" column="AdvertID"/> 
</list> 

etc... 

Однако это требует от меня укажите фиксированное количество вариантов, которых я действительно хотел бы избежать.

Каковы мои другие варианты? Могу ли я сжать класс RotationVariant в модель - без создания новых таблиц в базе данных - и как-то отобразить List<RotationVariant> на Rotation? Или мне нужно создать новую таблицу в базе данных, просто чтобы сохранить идентификатор для каждого RotationVariant?

ответ

1

Я просто столкнулся с этой проблемой сегодня. Читая документацию Hibernate и нашел ответ в разделе 6.1: Mapping Коллекция https://www.hibernate.org/hib_docs/nhibernate/html/collections.html:

Коллекции не могут содержать другие коллекции

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

+0

Спасибо за ссылку, которая, похоже, поддерживает вывод, который я достиг.Я нашел подобное заявление о NHibernate в одном из сообщений блога Айенде. В моем конкретном случае я закончил использование «Словаря» вместе с дополнительным неприменимым свойством, которое позволяет мне делать такой выбор, который мне нужен. Это позволяет мне хранить базу данных так, как она есть, - никаких новых сущностей не вводили. –

+0

Yup, я использую словарь, который не поддерживается, чтобы взаимодействовать с несколькими моими коллекциями. Кажется, отлично работает для crud обновлений для словарных статей тоже. – Marc

1

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

class Rotation 
{ 
    IList<AdvertVariant> AdvertVariants { get; private set; } 
} 


class AdvertVariant 
{ 
    int Variant { get; set; } 
    Advert Advert { get; set; } 
} 

отображение:

<class name="Rotation"> 
    <list name="AdvertVariants" table="RotationAdvert" > 
    <key column="RotationID"/> 
    <index column="Position"/> 
    <one-to-many class="AdvertVariant"/> 
    </list> 
</class> 

<class name="AdvertVariant"> 
    <property name="Variant" /> 
    <many-to-one name="Advert" column="VariantId"/> 
</class> 

База данных:

Rotation: 
    id 

AdvertVariant 
    id 
    Variant 
    RotationId 
    VariantId 

Advert 
    id 

Затем вы можете легко создать такие свойства, как это:

class Rotation 
{ 
    //... 
    IDictionary<int, IList<Adverts>> AdvertsByVariant 
    { 
    return VariantAdverts.ToDictionary(x => x.Variant, y => y.Advert); 
    } 
} 
0

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

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

  • Нет связанных вопросов^_^