Как сопоставить пользовательскую коллекцию NHibernate с fluentNHibernate? - PullRequest
2 голосов
/ 04 июля 2010

Я пытаюсь нанести на карту коллекцию в течение двух дней безуспешно. Я также прочитал все возможные статьи и форумы, но все еще там. Хорошо, вот проблема:

1) Класс коллекции содержит приватное поле "_internalCollection", которое сопоставляется с NHib.

2) Удерживающая сущность должна предоставлять свойство сбора только для чтения.

3) Я хочу избежать реализации интерфейса NHibernate IUserCollectionType !!!

Я сделал это с сопоставлением xml, и оно отлично работает. WarehouseEntity - это элемент коллекции. Склады - это свойство только для чтения в классе OrgEntity.

  <component name="Warehouses" class="Core.Domain.Collections.EntitySet`1[Core.Domain.OrgStructure.IWarehouseEntity,Core],Core">
    <set name="_internalCollection" table="`WAREHOUSE`" cascade="save-update" access="field" generic="true" lazy="true" >
      <key column="`WarehouseOrgId`" foreign-key="FK_OrgWarehouse" />
      <!--This is used to set the type of the collection items-->
      <one-to-many class="Domain.Model.OrgStructure.WarehouseEntity,Domain"/>
    </set>
  </component>

Любая идея, как я могу сделать это с беглым NHibernate?

РЕДАКТИРОВАТЬ: Core.Domain.Collections.EntitySet`1 является базовым классом коллекции. Он предоставляет базовые функциональные возможности для работы с коллекциями и может соответствовать любому классу с интерфейсом IEntity.

1 Ответ

3 голосов
/ 04 июля 2010

Попробуйте:

HasMany(x => x.Warehouses)
    .AsSet().KeyColumn("WarehouseOrgId")
    .Access.CamelCaseField(Prefix.Underscore)
    .ForeignKeyConstraintName("FK_OrgWarehouse");

Редактировать: я пропустил ключевую часть вопроса, так что вот еще одна попытка:

Component(x => x.Warehouses, m =>
    {
        m.HasMany<Warehouse>(Reveal.Member<EntitySet<IWarehouseEntity>>("_internalCollection")
           .AsSet().KeyColumn("WarehouseOrgId")
           .ForeignKeyConstraintName("FK_OrgWarehouse");
    });

Я уверен, что это не так, но, надеюсь, это поставит вас на правильный путь. Также посмотрите, используя ComponentMap .

Мой совет - полностью избегать пользовательских коллекций. Я заменил все наши методы расширения на IEnumerable<T>.

...