2010-07-16 34 views
2

我有一個簡單的對象模型,包含多個明細行的頭。我已經將標題對象上的bag屬性映射到行類,並且還在行類上放置了標題屬性以設置雙向關係。NHibernate的一對多映射不填充袋

當我運行我的測試時,使用NHibernate Profiler,我可以看到正在執行查詢,並且從數據庫中獲取標題和行,但集合始終爲空。

當我直接查詢線對象的集合時,我可以得到它們並看到標題對象被正確填充,所以我知道映射可能是好的。

對此略有不標準的方面是線對象有一個複合鍵。 (這是一個傳統的數據庫,我不能改變這一點),所以我想知道如果這是問題。

這裏是我的類和映射(簡體)

<class name="Header" table="HEADER"> 
    <id name="ID" column="HEAD_ID"> 
     <generator class="assigned" /> 
    </id> 

    <bag name="Lines" table="BODY" order-by="BODY_LINE"> 
     <key column="BODY_HEADER_ID"/> 
     <one-to-many class="Line"/> 
    </bag> 
    </class> 

    <class name="Line" table="BODY"> 
    <composite-id> 
     <key-property name="ID" column="BODY_HEADER_ID"/> 
     <key-property name="Line" column="SBODY_LINE"/> 
    </composite-id> 
    <many-to-one class="Header" name="Head" column="BODY_HEADER_ID" /> 
    </class> 

    public class Header { 
     public virtual string ID { get; set; } 
     public virtual IList<Line> Lines { get; set; } 
    } 

    public class Line { 
     public virtual string ID { get; set; } 
     public virtual int Line { get; set; } 
     public virtual Header Head { get; set; } 

     public override bool Equals(object obj) { 
      var other = obj as Line; 

      return ID == other.ID && Line == other.Line; 
     } 

     public override int GetHashCode() { 
      return (ID + "|" + Line.ToString()).GetHashCode(); 
     } 
    } 

我可以通過查詢線路分開對象解決這個問題,但我想知道我在做什麼錯。

編輯:好的,當我簡化了一些東西的時候,我並沒有一直這麼做。對困惑感到抱歉。我已經改變了映射和類定義來更準確地反映事情。

回答

3

您正在映射同一列兩次(BODY_HEADER_ID),併爲HEADER表使用不同的三個不同類名。

這是正確的路線映射:

<class name="Line" table="BODY"> 
    <composite-id> 
    <key-many-to-one class="Header" name="Header" column="BODY_HEADER_ID"/> 
    <key-property name="Line" column="SBODY_LINE"/> 
    </composite-id> 
</class> 

和當然,線應該只具有單一參考報頭。

+0

也可以在關係的一邊或另一邊使用「Inverse = true」。 – apollodude217 2010-07-16 18:03:58

+0

阿波羅是對的。袋子應該是相反的,並且可能級聯=「全部」。 – 2010-07-16 18:06:24

+0

@Diego我只能看到HEADER表的兩個類名:Header和Payslip(其映射未顯示)。第三名在哪裏? – apollodude217 2010-07-16 18:18:55