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; } }
}

このテーマに関するチュートリアルはインターネット上にたくさんありますが、どれも少し厄介な詳細をカバーしていません: 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>

誰か考えがありますか?

4

1 に答える 1

0

私は専門家ではあり<key property-ref=...>ませんが、この使い方は奇妙に見えます。できるはずで<key column="ParentID"/>、NHibernate は関連付けられたクラス (この場合はそれ自体) の主キーを自動的に使用します。

inverse="true"関係は双方向であるため、リストを に設定する必要がある場合もあります。[ドキュメントのセクション 6.8 を参照してください。]

于 2009-03-17T15:27:29.837 に答える