我有一个自我引用课程。子项具有对其父项的引用,父项具有子项列表。由于订购了子列表,我正在尝试使用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会正确更新。
你们有没有见过这个?有没有简单的解决方案?
答案 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 { }
}
}