NHibernate - как составить карту коллекции деревьев

Я хочу сопоставить свою объектную модель с NHibernate. В моей концепции есть одна сложная часть, и я не знаю, возможно ли это сделать в NHibernate.

Я хочу иметь коллекцию деревьев. У меня есть два класса (ниже указаны только важные свойства). Компонент — это узел дерева, а ComponentGroup — это набор деревьев.

public class Component
{
    public Component Parent { get; set; }
    public IList<Component> SubComponents { get; set; }
    public ComponentGroup Group { get; set; }
}

public class ComponentGroup
{
    public IList<Component> Components { get; set; }
}

Теперь я хочу, чтобы каждый компонент знал, к какой группе компонентов он принадлежит, поэтому мне нужна ссылка от каждого компонента к группе компонентов (свойство группы). Но ComponentGroup должен иметь только коллекцию корневых узлов (прямых дочерних элементов) — коллекцию Components. Так что это что-то вроде отображения один к половине ;) "одна" сторона имеет ссылку только на некоторые элементы со стороны "многие".

У вас есть идеи, как сопоставить что-то подобное с помощью NHibernate?


person kuba53280    schedule 03.08.2009    source источник


Ответы (1)


Я попробую (сгенерировано с помощью FluentNHibernate)

<class name="Component" table="`Component`" xmlns="urn:nhibernate-mapping-2.2">
<id name="ComponentId" type="Int32" column="ComponentId">
  <generator class="identity" />
</id>
<many-to-one name="Parent" column="ParentId" />
<bag name="SubComponents">
  <key column="ComponentId" />
  <one-to-many class="NHibernateTests.Component, NHibernateTests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</bag>
<many-to-one name="Group" column="GroupId" />

<class name="ComponentGroup" table="`ComponentGroup`" xmlns="urn:nhibernate-mapping-2.2">
<id name="Id" type="Int32" column="ComponentGroupId">
  <generator class="identity" />
</id>
<bag name="Components">
  <key column="ComponentGroupId" />
  <one-to-many class="NHibernateTests.Component, NHibernateTests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</bag>

ИЗМЕНИТЬ:

Если вы хотите, чтобы все ваши компоненты знали свою ComponentGroup, установите для всех них ComponentGroup .

И в ComponentGroup, если вы хотите только все корневые компоненты, измените сумку на:

<bag name="Components" where="ParentId is null"> 

поэтому вы получаете только корневые компоненты

person sirrocco    schedule 03.08.2009