2009-08-20 135 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