我有以下 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>
之前)。检查您是否使用的是最新版本。
顺便问一下,为什么要使用组件?你可以直接声明Path
如IList<Fragment>
.
关于nhibernate - Fluent Nhibernate 和自定义集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5120756/