Свободные коллекции Nhibernate и Custom - PullRequest
2 голосов
/ 25 февраля 2011

У меня есть следующая конфигурация Fluent NHibernate ...

public class TemplateMap : ClassMap<Template>
{
    public TemplateMap()
    {
        Not.LazyLoad();
        Id(t => t.Id).GeneratedBy.Sequence("TEMPLATE_ID_SEQ");
        Map(t => t.Name);
        Component(t => t.Path, 
            p => p.HasMany(f => f.Fragments)
                .Access.CamelCaseField(Prefix.Underscore)
                .Cascade.AllDeleteOrphan()
                .KeyColumn("template_id")
            )
            .Access.CamelCaseField(Prefix.Underscore);
    }
}

Что приводит к следующему HBM ...

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-access="property" auto-import="true" default-cascade="none" default-lazy="true">
  <class xmlns="urn:nhibernate-mapping-2.2" lazy="false" name="TestApp.Domain.Template, TestApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" table="`Template`">
    <id name="Id" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <column name="Id" />
      <generator class="sequence">
        <param name="sequence">TEMPLATE_ID_SEQ</param>
      </generator>
    </id>
    <component name="Path" insert="true" update="true" access="field.camelcase-underscore" optimistic-lock="true">
      <bag access="field.camelcase-underscore" cascade="all-delete-orphan" name="Fragments">
        <key>
          <column name="template_id" />
        </key>
        <one-to-many class="TestApp.Domain.Fragment, TestApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
      </bag>
    </component>
    <property name="Name" type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <column name="Name" />
    </property>
  </class>
</hibernate-mapping>

Чтобы рассматривать коллекцию как список, я добавляю метод "AsList" ...

public class TemplateMap : ClassMap<Template>
{
    public TemplateMap()
    {
        Not.LazyLoad();
        Id(t => t.Id).GeneratedBy.Sequence("TEMPLATE_ID_SEQ");
        Map(t => t.Name);
        Component(t => t.Path, 
            p => p.HasMany(f => f.Fragments)
                .Access.CamelCaseField(Prefix.Underscore)
                .Cascade.AllDeleteOrphan()
                .KeyColumn("template_id")
                .AsList(index => index.Column("Position"))
            )
            .Access.CamelCaseField(Prefix.Underscore);
    }
}

Что приводит к следующему HMB ...

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-access="property" auto-import="true" default-cascade="none" default-lazy="true">
  <class xmlns="urn:nhibernate-mapping-2.2" lazy="false" name="TestApp.Domain.Template, TestApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" table="`Template`">
    <id name="Id" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <column name="Id" />
      <generator class="sequence">
        <param name="sequence">TEMPLATE_ID_SEQ</param>
      </generator>
    </id>
    <component name="Path" insert="true" update="true" access="field.camelcase-underscore" optimistic-lock="true">
      <list access="field.camelcase-underscore" cascade="all-delete-orphan" name="Fragments">
        <index>
          <column name="Position" />
        </index>
        <key>
          <column name="template_id" />
        </key>
        <one-to-many class="TestApp.Domain.Fragment, TestApp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
      </list>
    </component>
    <property name="Name" type="System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <column name="Name" />
    </property>
  </class>
</hibernate-mapping>

Однако, хотя первая конфигурация (без «AsList») работает нормально, вторая вызывает эту ошибку времени выполнения:

Элемент 'list' в пространстве имен 'urn: nhibernate-mapping-2.2' имеет недопустимый дочерний элемент 'index' в Пространство имен 'Урна: NHibernate-отображение-2,2'. Список ожидаемые возможные элементы: 'мета, выбрать, кэшировать, синхронизировать, комментарий, ключ 'в пространстве имен 'Урна: NHibernate-отображение-2,2'

.

Есть идеи?

Немного подробнее о модели моего домена: шаблон имеет идентификатор, имя и путь . путь - упорядоченный список фрагментов .

Большое спасибо

Sandy

1 Ответ

3 голосов
/ 25 февраля 2011

NHibernate прав: Fluent генерирует неверный XML (<key> должен идти раньше <index>).Проверьте, используете ли вы последнюю версию.

Кстати, почему вы используете компонент?Вы можете просто объявить Path как IList<Fragment>.

...