nhibernate - Fluent Nhibernate 和自定义集合

标签 nhibernate collections fluent-nhibernate hbm

我有以下 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”)工作正常,但第二个配置会导致此运行时错误:

The element 'list' in namespace 'urn:nhibernate-mapping-2.2' has invalid child element 'index' in namespace 'urn:nhibernate-mapping-2.2'. List of possible elements expected: 'meta, subselect, cache, synchronize, comment, key' in namespace 'urn:nhibernate-mapping-2.2'.

有什么想法吗?

有关我的域模型的更多详细信息:模板具有 ID、名称和路径路径片段的有序列表。

非常感谢

桑迪

最佳答案

NHibernate 是对的:Fluent 正在生成无效的 XML( <key> 应该在 <index> 之前)。检查您是否使用的是最新版本。

顺便问一下,为什么要使用组件?你可以直接声明PathIList<Fragment> .

关于nhibernate - Fluent Nhibernate 和自定义集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5120756/

相关文章:

c# - NHibernate - 使用 CreateMultiQuery

NHibernate 约定 ModelMapper; IsRootEntity 和 IdEntity 有什么区别

java - 两个键是相同的 hashMap 覆盖写“现有的?

java - 使用匿名 Comparable 的 Collections.sort 出错

c# - 如何使用 Fluent NHibernate 和多个数据库识别特定实体的 session 工厂

NHibernate Linq - 如何创建一个带有 IS NOT NULL 的 where 语句

nhibernate - 是什么导致: Unix transport error?

java - gson解析嵌套的json对象

c# - FluentNHibernate映射设置——SQL Server数据库中的文件存储

fluent-nhibernate - Fluent nHibernate Automapping 不创建复数表名