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)