Отображение братьев и сестер в NHibernate - PullRequest
0 голосов
/ 01 марта 2009

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

Проблема, с которой я сталкиваюсь, - это древовидная природа карты сайта. Объект ASP.NET имеет следующий и предыдущий одноуровневый объект. Это хорошо и хорошо. Я не хотел иметь NextSiblingId и PreviousSiblingId в моей таблице SiteMapNode. Я решил, что при отображении этих объектов было бы хорошо иметь свойство OrdinalPosition. После исследования кажется, что я не могу сделать сопоставление свойств NextSibling и PreviousSibling в NHibernate. Моя мысль исправить это сделать коллекцию братьев и сестер. Эта коллекция будет иметь тот же ParentNodeId, что и объект владельца.

Возможно ли это?

Вот файл сопоставления, который я создал до сих пор:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="AthletesCafe.Core.Domain.System.SiteMap" assembly="AthletesCafe.Core">

  <class name="SiteMapNode" table="SiteMapNode" lazy="true" >

    <id name="ID" type="Int32" unsaved-value="0">
      <column name="ID" not-null="true" unique="true" index="PK_SiteMapNode"/>
      <generator class="identity" />
    </id>

    <property name="Title" column="Title" type="String" length="255" not-null="true" />
    <property name="Description" column="Description" type="String" not-null="false" />

    <property name="Url" column="Description" type="String" not-null="true" length="1000"  />

    <property name="Key" column="NodeKey" type="String" not-null="true" length="255"  />

    <property name="OrdinalPosition" column="OrdinalPosition" type="Int32" not-null="true" />

    <property name="ReadOnly" column="ReadOnly" not-null="true" type="System.Boolean" />

    <property name="IsExternal" column="IsExternal" not-null="true" type="System.Boolean" />

    <many-to-one name="ParentNode" column="ParentNodeId" class="AthletesCafe.Core.Domain.System.SiteMap.SiteMapNode, AthletesCafe.Core" 
                 access="field.pascalcase-underscore" not-null="false" />

    <bag name="Siblings" access="field.pascalcase-underscore" inverse="true" lazy="true">
      <key column="ParentNodeId" />
      <many-to-many foreign-key="ParentNodeId" class="AthletesCafe.Core.Domain.System.SiteMap.SiteMapNode, AthletesCafe.Core" />
    </bag>

    <bag name="ChildNodes" generic="true" inverse="true" lazy="true" access="field.pascalcase-underscore">
      <key column="ParentNodeId" />
      <one-to-many  class="AthletesCafe.Core.Domain.System.SiteMap.SiteMapNode, AthletesCafe.Core"/>
    </bag>

  </class>
</hibernate-mapping>

Сумка Siblings возвращает то же самое, что и коллекция ChildNodes. Я просто не понимаю, как работает весь ключ и свойства внешнего ключа. Я понял, что свойство столбца в ключевом элементе говорит nHibernate использовать этот столбец в объекте владельца для сопоставления со столбцом стороннего объекта. Мне просто нужно выяснить, как заставить nHibernate взглянуть на ParentNodeId на узлах коллекции. Кто-нибудь может помочь?

1 Ответ

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

Ознакомьтесь с этой записью в блоге: Как отобразить дерево в NHibernate

...