NHibernate: сопоставление сложного типа значения с атрибутами?

Я безуспешно пытался сопоставить IDictionary с базой данных с помощью NHibernate (2.1.2.4000) и NHibernate.Mapping.Attributes (1.2.1.4000). Я нашел несколько блогов в Интернете, в которых упоминается, что можно сопоставить атрибут ([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>

Используемые ресурсы:

Другие темы, которые я прочитал


person creatio    schedule 25.03.2011    source источник


Ответы (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>

Подставляя любые имена ваших свойств.

person Vadim    schedule 25.03.2011
comment
И как мне это сделать с атрибутами NHibernate ?? - person creatio; 29.03.2011
comment
@creatio, я совсем не знаком с этим проектом, так что, боюсь, вам придется разобраться в нем. - person Vadim; 29.03.2011