Nhibernate - 映射列表不更新列表索引

时间:2009-08-24 07:45:37

标签: nhibernate nhibernate-mapping mapping orm

我有一个自我引用课程。子项具有对其父项的引用,父项具有子项列表。由于订购了子列表,我正在尝试使用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>

我遇到的问题是当我有一个双向映射子&lt; - &gt; parent时,当我做我的CRUD舞时,数据库中的列表索引(ListOrder)没有更新。这意味着,当我删除一个孩子,保存到数据库并再次获取父级后,我在子列表中出现漏洞。如果我删除双向性,通过从子节点到父节点没有多对一(并且没有inverse = true),ListOrder会正确更新。

你们有没有见过这个?有没有简单的解决方案?

1 个答案:

答案 0 :(得分:5)

是的,这是因为inverse = true,另一种解决方案是使用set或bag而不是list with order =“ListOrder”,将ListOrder列作为属性添加到MyClass类,并使用空的setter和a 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 { }
    }
}