2013-05-13 73 views
1

我試圖讓NHibernate(3.3.1)加載一個遞歸的父/子類別關係。NHibernate'Category'Child/Parent mapping(XML)

public class Category 
{ 
    public virtual int Id { get; set; } 

    public virtual bool IsActive { get; set; } 

    public virtual string Name { get; set; } 

    public virtual Category Parent { get; set; } 

    public virtual IList<Category> Children { get; set; } 

    public Category() 
    { 
     Children = new List<Category>(); 
    } 

    public virtual int GetChildCount() 
    { 
     return Children.Count; 
    } 
} 

我的XML映射...

<class name="nHibernatePOC.Domain.Category, nHibernatePOC" lazy="true"> 
    <id name="Id" column="CategoryId"> 
     <generator class="identity" /> 
    </id> 
    <property name="Name" column="Name" /> 
    <property name="IsActive" column="IsActive" /> 
    <many-to-one name="Parent" class="nHibernatePOC.Domain.Category" column="ParentCategoryId" /> 

    <bag lazy="true" name="Children"> 
     <key column="ParentCategoryId" /> 
     <one-to-many class="nHibernatePOC.Domain.Category" /> 
     <loader query-ref="GetCategoryByParentId"/> 
    </bag> 
    </class> 

我的問題是,當我嘗試訪問Children.Count我得到一個NullReferenceException因爲Parent可以爲空。

+0

孩子不應該爲空,因爲如果沒有找到孩子,它將被初始化爲一個空集合。可能' 2013-05-14 08:00:33

+0

你可以顯示保存類別的代碼嗎?另外,當你有一個反向引用(父屬性)時,你應該將該集合標記爲反向,以便不插入parentId – Firo 2013-05-14 11:22:18

回答

0

爲了將來的參考,問題與用於加載子集合的存儲過程有關。 (而不是從表/視圖延遲加載)。謝天謝地,我可以從視圖加載而不是使用存儲過程。

當我刪除<loader元素並恢復爲使用數據庫(MSSQL 2012)的視圖時,它按預期工作。

非常奇怪的是,任何需要使用存儲過程的人都很抱歉,但我猜這是在這種情況下刪除它們的一個很好的理由。