NHibernate - как отобразить коллекцию деревьев - PullRequest
0 голосов
/ 03 августа 2009

Я хочу сопоставить мою объектную модель с 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; }
}

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

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

1 Ответ

0 голосов
/ 03 августа 2009

Я сделаю снимок (генерируется с помощью 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>

EDIT:

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

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

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

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

...