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

Tho*_*röm 6 mapping nhibernate orm nhibernate-mapping

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

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

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

小智 5

是的,这是因为inverse = true,另一种解决方案是使用set或bag而不是list with order ="ListOrder",将ListOrder列作为属性添加到MyClass类中,使用空的setter和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>
Run Code Online (Sandbox Code Playgroud)

和班级

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 { }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢你的建议.在今天的代码中,我在添加/删除子项时使用钩子来正确设置ListOrder.我基本上在NHibernate上工作,因为在我的域中添加逻辑,我没有按照预期工作.您的建议是另一个域层解决方法.它可能比我的好,但仍然是一种解决方法.如果我的列表的语义是列表,我想将其映射为列表,而不是作为已排序的包. (3认同)