2009-08-20 167 views
8

我的班級有一個Dictionary<string, List<string>>類型的字段。用NHibernate映射它的最佳方式是什麼?我最好把它當作一個領域,不要公開它。NHibernate:映射列表字典

非常感謝!

ulu

回答

7

您不能直接映射它。有兩個規則來考慮:

  • 始終使用集合(如IList<T>IDictionary<K,V>)接口
  • NH不支持嵌套集合。我從來沒有在 之前看到它的應用程序,從來沒有聽到有人請求它。

把你的字符串列表插入一個類,並使用接口:

class StringList 
{ 
    IList<string> Strings { get; private set; } 
} 

class Entity 
{ 
    private IDictionary<string, StringList> stringDict; 
} 

你甚至可能看到有這樣一類的一些優點。

映射:

<class name="Entity"> 
    ... 
    <map name="stringDict" table="Entity_StringDict" access="field"> 
    <key column="Entity_FK"/> 
    <index column="Key" type="System.String"/> 
    <composite-element class="StringList"> 
     <bag name="Strings" table="Entity_StringDict_Strings"> 
     <key column="Entity_StringDict_FK"/> 
     <element type="System.String" column="String"/> 
     </bag> 
    </composite-element> 
    </map> 
</class> 

映射到三個表:

  • Entity
  • Entity_StringDict
    • Entity_FK
    • Key
  • Entity_StringDict_Strings
    • Entity_StringDict_FK
    • String
+0

好極了,我給它一試! – ulu 2009-08-20 20:41:35

+1

嗯我收到一個錯誤: XML驗證錯誤:命名空間'urn:nhibernate-mapping-2.2'中的元素'composite-element'在命名空間'urn:nhibernate-mapping-2.2'中有無效的子元素'bag' 。預期的可能元素列表:'名稱空間'urn:nhibernate-mapping-2.2'中的'parent,property,many-to-one,nested-composite-element'。 使用Nhibernate 2.0.1 .. – ulu 2009-08-21 17:16:07

+0

此外,文檔說,「複合元素可能包含組件,但不包含集合」。 – ulu 2009-08-21 18:29:48