Рекурсивное дерево NHibernate с привязкой данных в комбинированном окне Winforms - PullRequest
0 голосов
/ 10 августа 2011

После нескольких дней поиска и пробных действий мне нужно задать вопрос, потому что у меня нет выбора.Сценарий прост: рекурсивное дерево категорий.Дерево извлекается из одной таблицы и должно быть связано с комбинированным списком в приложении Winforms.

Сопоставление в NHibernate не является проблемой;дерево правильно отображается.Также работает привязка к выпадающему списку.Проблема в том, что когда я хочу сохранить категорию, я получаю индекс параметра из-за ошибки диапазона, и это понятно, потому что, как вы можете видеть из приведенных ниже списков, NH использует и свойство, и внешний ключ в множественномодно отображение для обновления базы данных, и они оба ссылаются на один и тот же столбец.

Проблема в том, что мне нужно свойство ParentGroupId для привязки данных в комбинированном ящике, а также мне нужен внешний ключ во многихсопоставление один к одному.Кто-нибудь сталкивался с подобной ситуацией?Я думаю, что попробовал почти любой возможный сценарий, но пока не повезло .....

Класс:

public class ProductGroup : EntityBindable
{
    public virtual string GroupName { get; set; }
    public virtual ProductGroup _parentGroup { get; set; }
    public virtual IList<ProductGroup> _subGroups { get; set; }
    public virtual int ParentGroupId { get; set; }
}

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

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Brickx.Model"      namespace="Brickx.Model">
  <class name="ProductGroup">
    <id name="Id" type="int" unsaved-value="0">
      <generator class="hilo">
      </generator>
    </id>

    <property name="GroupName" type="string" length="50" />
    <property name="ParentGroupId" type="Int32" />

    <many-to-one name="ParentGroup"
                 column="ParentGroupId"
                 class="ProductGroup" />

    <bag name="SubGroups" cascade="all, delete-orphan">
      <key column="ParentGroupId" />
      <one-to-many class="ProductGroup" />
    </bag>
  </class>
</hibernate-mapping>

1 Ответ

0 голосов
/ 10 августа 2011

У вас есть два варианта:

1) Удалить отображение ParentGroupId из файла hbm.Таким образом, NHibernate не будет даже сейчас об этой собственности и не вызовет у вас никаких проблем.Свяжите свой комбинированный список с group.ParentGroup.Id.Если это невозможно, вы можете просто реализовать это свойство самостоятельно:

class ProductGroup {
    ...
    public virtual int ParentGroupId {
        get {
            if (_parentGroup != null) {
                return _parentGroup.Id;
            }
            return 0;
        }
    }
    ...
}

2) Отобразить 'ParentGroupId' с update и insert , установленными в false:

<property name="ParentGroupId" type="Int32" update="false" insert="false"/>

Обратите внимание, что ваше отображение может быть неправильным, и вам может потребоваться добавить атрибут inverse в вашу «сумку».Таким образом, вы говорите NHibernate, чтобы в первую очередь сохранялась двусторонняя связь «многие-к-одному».Попробуйте установить его так:

<bag name="SubGroups" cascade="all, delete-orphan" inverse="true" >
...