2012-10-01 112 views
2

我想通過翻譯'NHibernate in Action'中的代碼來學習NHibernate映射,我遇到了一個例子的問題。我已經介紹了我正在嘗試翻譯的XML和翻譯它的努力。代碼基本上具有類別和項目之間的多對多關係。它使用名爲CategorizedItem的組件類來維護兩個實體之間的關係。NHibernate複合元素映射的代碼

我遇到的問題是,一旦我在lambda中聲明瞭Category的Items屬性,Item類的屬性是唯一可用於在組件映射中選擇的屬性。我想讓映射知道CategorizedItem的屬性是要在關係中映射的屬性,但我對如何實現這一點感到不知所措。下面是我試圖翻譯的XML ...

<set name="Items" table="CATEGORY_ITEM" lazy="true" > 
    <key column="CATEGORY_ID"/> 
    <composite-element class="CategorizedItem"> 
    <parent name="Category"/> 
    <many-to-one name="Item" class="Item" column="ITEM_ID" not-null="true"/> 
    <many-to-one name="User" class="User" column="USER_ID" not-null="true"/> 
    <property name="DateAdded" column="DATE_ADDED" not-null="true"/> 
    </composite-element> 
</set> 

...這裏是我已部分完成的映射。

Set(
    category => category.Items, 
    map => 
    { 
     map.Key(key => 
     { 
      key.Column("CATEGORY_ID"); 

     }); 
     map.Table("CATEGORY_ITEM"); 
     map.Lazy(CollectionLazy.Lazy); 
    }, 
    r => r.Component(m => 
    { 
     m.Class 

    }) 
); 

該組件的類屬性看起來像可能的目標,但它拒絕將CategorizedItem作爲類型參數。任何幫助將不勝感激。

+1

什麼意思「拒絕CategorizedItem」?編譯器錯誤,運行時錯誤,什麼錯誤信息?顯示您嘗試的完整代碼。 –

+0

嗨@Stefan Steinegger, – MickySmig

+0

您好@Stefan Steinegger,我無法給您一個錯誤信息,因爲我沒有得到的重點是我可以運行代碼。 – MickySmig

回答

3

就快 - 在調用你需要設置你的組件映射到關係表的如何屬性組成,即:

 Set(
      category => category.Items, 
      map => 
       { 
        map.Key(key => 
           { 
            key.Column("CATEGORY_ID"); 

           }); 
        map.Table("CATEGORY_ITEM"); 
        map.Lazy(CollectionLazy.Lazy); 
       }, 
      r => r.Component(
       m => 
        { 
         m.Parent(ci => ci.Parent); 
         m.ManyToOne(ci => ci.Item, r2 => r2.Column("ITEM_ID")); 
         m.ManyToOne(ci => ci.User, r2 => r2.Column("USER_ID")); 
         m.Property(ci => ci.DateAdded); 
        }) 
      ); 
+0

感謝@馬丁恩斯特,我必須承認,我已經改變了我的代碼,使關係組件成爲一個實體,但我現在將它改回來使用你的。非常感謝。 – MickySmig