Nhibernate - список отображения не обновляет индексы списка - PullRequest
6 голосов
/ 24 августа 2009

У меня есть один класс, ссылающийся на себя. Ребенок имеет ссылку на своего родителя, а родитель имеет список детей. Поскольку список детей упорядочен, я пытаюсь отобразить отношения, используя NHibernate.

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

<class name="MyClass">
  <id name="Id">
    <generator class="native"/>
  </id>
  <list name="Children" cascade="delete" inverse="true">
    <key column="ParentId"/>
    <index column="ListOrder"/>
    <one-to-many class="MyClass"/>
  </list>
  <many-to-one name="Parent" class="MyClass" column="ParentId"/>
</class>

Проблема, с которой я сталкиваюсь, заключается в том, что, когда у меня есть родительский объект двунаправленного отображения <->, индекс списка (ListOrder) не обновляется в базе данных, когда я выполняю танец CRUD. Это означает, что когда я, например, удалить ребенка, я получаю дыры в списке детей после сохранения в базе данных и повторного извлечения родителя. Если я удаляю двунаправленность, не имея много-к-одному от дочерних элементов к родительскому (и не обращая = true), ListOrder обновляется правильно.

Кто-нибудь из вас видел это раньше? Есть ли простое решение?

1 Ответ

5 голосов
/ 18 ноября 2009

Да, это из-за inverse = true, альтернативным решением будет использование набора или пакета вместо списка с order = "ListOrder", добавление столбца ListOrder в качестве свойства к классу MyClass с пустым установщиком и getter, который всегда возвращает свой индекс из дочерней коллекции своего родителя. Как это:

<class name="MyClass">
    <id name="Id">
        <generator class="native"/>
    </id>
    <bag name="Children" cascade="delete" inverse="true" order-by="ListOrder">
        <key column="ParentId"/>
        <one-to-many class="MyClass"/>
    </bag>
    <property name="ListOrder" column="ListOrder"/>
    <many-to-one name="Parent" class="MyClass" column="ParentId"/>
</class>

и класс

public class MyClass
{
    public virtual int ID { get; set; }
    public virtual IList<MyClass> Children { get; set; }
    public virtual MyClass Parent { get; set; }

    public virtual int ListOrder
    {
        get
        {
            if (Parent == null || !Parent.Children.Contains(this)) return -1;
            return Parent.Children.IndexOf(this);
        }
        set { }
    }
}
...