NHibernate:映射列表字典

NHibernate:映射列表字典,nhibernate,mapping,Nhibernate,Mapping,我的类有一个类型为Dictionary的字段。用NHibernate绘制地图的最佳方式是什么?我最好把它作为一个字段,不要暴露出来 非常感谢 乌卢您不能直接映射它。有两条规则需要考虑: 始终为集合使用接口(例如,IList,IDictionary) NH不支持嵌套集合。我以前从未见过申请它的人 从来没有听到有人要求 将字符串列表放入类中并使用接口: class StringList { IList<string> Strings { get; private set; } }

我的类有一个类型为
Dictionary
的字段。用NHibernate绘制地图的最佳方式是什么?我最好把它作为一个字段,不要暴露出来

非常感谢


乌卢

您不能直接映射它。有两条规则需要考虑:

  • 始终为集合使用接口(例如,
    IList
    IDictionary
  • NH不支持嵌套集合。我以前从未见过申请它的人 从来没有听到有人要求
将字符串列表放入类中并使用接口:

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

class Entity
{
  private IDictionary<string, StringList> stringDict;
}
类字符串列表
{
IList字符串{get;private set;}
}
类实体
{
私人词典;
}
你甚至可以看到开设这样一门课的一些好处

映射:

<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>

...
映射到三个表:

  • 实体
  • 实体\u StringDict
    • 实体\u FK
  • Entity\u StringDict\u Strings
    • Entity\u StringDict\u FK
    • String

太棒了,我要试一试!嗯,我收到一个错误:XML验证错误:命名空间“urn:nhibernate-mapping-2.2”中的元素“composite element”在命名空间“urn:nhibernate-mapping-2.2”中具有无效的子元素“bag”。可能元素的列表应为:命名空间“urn:nhibernate-mapping-2.2”中的“父元素、属性、多对一、嵌套复合元素”。使用Nhibernate 2.0.1..还有,文档中说,“复合元素可能包含组件,但不包含集合”。我最终添加了一个实体而不是一个值类(在您的示例中是StringList),我相信我的设计变得更好了。我们可以称之为映射驱动的开发吗?无论如何,谢谢你的帮助,你为我指明了正确的方向。在NH2.1中,你可以将集合放入复合元素中。有时最好编写一些附加类来设计复杂的结构。“映射驱动的开发”对我来说听起来相当糟糕,因为类模型不应该由NH驱动,即使存在一些权衡。NH试图尽可能少地影响您的模型。