2

我们需要使用 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; } }
}

互联网上有很多关于这个主题的教程,但没有一个包含一些令人讨厌的细节:我们需要将订单保存在儿童收藏中。我们尝试了以下映射,但它导致 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>

有人有想法吗?

4

1 回答 1

0

我不是专家,但<key property-ref=...>在这种用法中对我来说看起来很奇怪。你应该可以这样做<key column="ParentID"/>,NHibernate 将自动使用关联类的主键——在这种情况下是它本身。

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

于 2009-03-17T15:27:29.837 回答