2009-03-12 6 views
2

を使用して、ツリーのマッピングを命じ:たちはNHibernateはを使用して単純なクラスをマップする必要があります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> 

誰もが考えていますか?

+0

コードをコンパイルすると、「クラス 'CatalogItem'のプロパティ 'Children'のセッターが見つかりませんでした」というエラーが表示されます。 –

答えて

0

私は専門家ではありませんが、この使用法では<key property-ref=...>が奇妙に見えます。 <key column="ParentID"/>を実行できるはずです。この場合、NHibernateは自動的に関連するクラスの主キーを使用します。

リレーションシップは双方向であるため、リストをinverse="true"に設定する必要があります。 [ドキュメントの6.8節を参照]

関連する問題