如何使用fluentNHibernate映射NHibernate自定义集合?

时间:2010-07-04 18:18:35

标签: nhibernate collections fluent-nhibernate nhibernate-mapping

我正在尝试将该集合映射两天而没有成功。我还阅读了所有可能的文章和论坛,但仍然在那里。好的,这是问题所在:

1)集合类包含一个私有字段“_internalCollection”,它与NHib映射。

2)持有实体应通过readonly属性公开收集。

3)我想避免实现NHibernate接口IUserCollectionType !!!

我使用xml映射完成了这项工作,效果很好。 WarehouseEntity是一个集合Item。仓库是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 个答案:

答案 0 :(得分:3)

尝试:

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>上的扩展方法替换了我们所有的。