使用 NHibernate 的双连接有序树映射
Posted
技术标签:
【中文标题】使用 NHibernate 的双连接有序树映射【英文标题】:Doubly connected ordered tree mapping using NHibernate 【发布时间】:2009-03-12 20:31:12 【问题描述】:我们需要使用 NHibernate 映射简单的类:
public class CatalogItem
private IList<CatalogItem> children = new List<CatalogItem>();
public Guid Id get; set;
public string Name get; set;
public CatalogItem Parent get; set;
public IList<CatalogItem> Children
get return children;
public bool IsRoot get return Parent == null;
public bool IsLeaf get return Children.Count == 0;
互联网上有很多关于这个主题的教程,但没有一个包含一些令人讨厌的细节:我们需要在 Children 集合中保留顺序。我们尝试了以下映射,但它导致 NHibernate 抛出奇怪的异常(“非静态方法需要一个目标。”)。
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" namespace="Domain.Model" assembly="Domain">
<class name="CatalogItem" lazy="false">
<id name="Id" type="guid">
<generator class="guid" />
</id>
<property name="Name" />
<many-to-one name="Parent" class="CatalogItem" lazy="false" />
<list name="Children" cascade="all">
<key property-ref="Parent"/>
<index column="weight" type="Int32" />
<one-to-many not-found="exception" class="CatalogItem"/>
</list>
</class>
</hibernate-mapping>
有人有什么想法吗?
【问题讨论】:
当我编译您的代码时,我收到一条错误消息,提示“在类 'CatalogItem' 中找不到属性 'Children' 的设置器”。 【参考方案1】:我不是专家,但 <key property-ref=...>
在这种用法中对我来说看起来很奇怪。你应该能够做到<key column="ParentID"/>
,NHibernate 将自动使用关联类的主键——在这种情况下是它自己。
您可能还需要将列表设置为inverse="true"
,因为关系是双向的。 [请参阅文档中的第 6.8 节。]
【讨论】:
以上是关于使用 NHibernate 的双连接有序树映射的主要内容,如果未能解决你的问题,请参考以下文章
NHibernate 2 + Fluent Nhibernate 中等信任