【问题标题】:Doubly connected ordered tree mapping using NHibernate使用 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' 的设置器”。

标签: nhibernate orm hbm


【解决方案1】:

我不是专家,但 &lt;key property-ref=...&gt; 在这种用法中对我来说看起来很奇怪。你应该能够做到&lt;key column="ParentID"/&gt;,NHibernate 将自动使用关联类的主键——在这种情况下是它自己。

您可能还需要将列表设置为inverse="true",因为关系是双向的。 [请参阅文档中的第 6.8 节。]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多