NHibernate:映射具有属性的复杂值类型?

Posted

技术标签:

【中文标题】NHibernate:映射具有属性的复杂值类型?【英文标题】:NHibernate: mapping a complex value type with attributes? 【发布时间】:2011-03-25 08:04:32 【问题描述】:

我一直在尝试使用 NHibernate (2.1.2.4000) 和 NHibernate.Mapping.Attributes (1.2.1.4000) 将 IDictionary 映射到数据库,但没有成功。我在网上找到了一些博客提到可以映射到属性([1][2]),但我似乎无法让它工作,因为我不断收到以下错误:

映射泛型集合 FormsEntity.Attributes 时出错:应有 1 个泛型参数,但属性类型有 2 个

属性属性如下所示:

[Map(2, Name = "Attributes", Cascade = CascadeStyle.All)]
[Key(3, Column = "FormsEntityID")]
[Index(4, Column = "Name", Type = "string")]
[CompositeElement(5, ClassType=typeof(htmlAttribute))]
public virtual IDictionary<string, HtmlAttribute> Attributes

    get  return _attributes; 
    set  _attributes = value; 

这又会生成以下 .hbm 文件:

<hibernate-mapping auto-import="false" xmlns="urn:nhibernate-mapping-2.2">
    <joined-subclass name="FormsEntity, Entities" extends="BaseEntity, Entities" 
        table="CMS_FormsEntity ">

        <key column="Id" />
        <property name="Title" />
        <property name="Description">
            <column name="description" sql-type="nvarchar(MAX)" />
        </property>
        <property name="IsTemplate" />

        <map name="Attributes" cascade="all">
              <key column="FormsEntityID" />
              <index column="Name" type="string" />
              <composite-element class="HtmlAttribute, Entities" />
        </map>

    </joined-subclass>
</hibernate-mapping>

使用的资源:

[1] How to map to a Generic IDictionary [2] NHibernate Mapping (the section of mapping a complex value type)

我读过的其他主题

Map = IDictionary. Which NHibernate.Mapping.Attributes should I use in my class to map a dictionary?

【问题讨论】:

【参考方案1】:

您需要指定如何在复合元素上映射属性:

    <map name="Attributes" cascade="all">
          <key column="FormsEntityID" />
          <index column="Name" type="string" />
          <composite-element class="HtmlAttribute, Entities">
               <property name="Name" />
               <property name="Value" />
          </composite-element>
    </map>

替换您的属性名称。

【讨论】:

我将如何使用 NHibernate 属性来做到这一点?? @creatio,我对那个项目一点也不熟悉,所以恐怕你需要弄清楚那个。

以上是关于NHibernate:映射具有属性的复杂值类型?的主要内容,如果未能解决你的问题,请参考以下文章

nHibernate:如何映射可以是任何类型的属性?

NHibernate 映射关系

NHibernate 映射 - 带有被重用列的用户类型?

将引用作为属性的 Nhibernate 映射值对象

Fluent NHibernate:如何在关系表上映射具有附加属性的多对多关系?

第二部分 Nhibernate中的类型