2009-03-12 4 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'속성에 대한 setter를 찾을 수 없습니다."라는 오류 메시지가 나타납니다. –

답변

0

나는 전문가는 아니지만, <key property-ref=...>은이 사용법에서 이상하게 보입니다. 당신은 <key column="ParentID"/>을 할 수 있어야하고, NHibernate는 자동적으로 연관된 클래스의 프라이 머리 키를 사용합니다 -이 경우에.

관계가 양방향이기 때문에 목록을 inverse="true"으로 설정해야 할 수도 있습니다. [문서의 6.8 절 참조]