NHibernate 映射到基类而不是子类

标签 nhibernate nhibernate-mapping

在我的业务模型中,我有一个实体类(IPoint 接口(interface)),它具有相同类型的子元素列表。 DB中的链接是通过多对多表进行的。该实体还具有用于子类化的鉴别器(IPoint 实现)。

首先,我为此做了简单的多对多映射,一切都运行良好。但后来我在映射中建立了(作为最佳实践建议)一对多关联,而不是多对多。为此,我使用包含父元素和子元素的 composite-id 创建了新类 PointLink。但是 NHibernate 并没有对这些子元素进行子类化(就像存在多对多关联时那样)。他制作了自己的代理对象(IPoint 实例)。看起来他在引用中完全忽略了子类规则。但对于父元素,却使用了子类规则。

IPoint的映射:

<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" name="Elgsis.Core.IPoint, Elgsis.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" table="Points">
<id name="Id" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
  <column name="Id" />
  <generator class="identity" />
</id>
<discriminator type="String">
  <column name="Type" />
</discriminator>
<property name="Name" type="System.String, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
  <column name="Name" />
</property>
<bag cascade="all" inverse="true" name="Links">
  <key>
    <column name="ParentId" />
  </key>
  <one-to-many class="Elgsis.Core.PointLink, Elgsis.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</bag>
<subclass name="Elgsis.Core.Meter, Elgsis.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" discriminator-value="1" />
<subclass name="Elgsis.Core.Controller, Elgsis.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" discriminator-value="2" />
</class>
</hibernate-mapping>

以及链接实体PointLink的映射

<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" name="Elgsis.Core.PointLink, Elgsis.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" table="Points_Points">
<composite-id mapped="false" unsaved-value="undefined">
  <key-many-to-one name="Parent" class="Elgsis.Core.IPoint, Elgsis.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">
    <column name="ParentId" />
  </key-many-to-one>
  <key-many-to-one name="Child" class="Elgsis.Core.IPoint, Elgsis.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null">
    <column name="ChildId" />
  </key-many-to-one>
</composite-id>
</class>
</hibernate-mapping>

也许我应该使用类而不是接口(interface)作为基本类型,或者它不应该有很大的区别?

我正在使用最新的 NHibernate 2.1.0.4000 和 FluentNHibernate 1.0.0.0

谢谢!

最佳答案

问题是开启了延迟加载。只需针对引用的类型将其关闭,现在即可正确加载。

post关于这种行为。

关于NHibernate 映射到基类而不是子类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1355401/

相关文章:

nhibernate - 为什么是 Fluent NHibernate 与 hbm XML 文件?

nhibernate - FluentNhibernate IDictionary<Entity,ValueObject>

nhibernate - 使用 nhibernate 划分结果为 "Could not determine member from"

c# - 我如何使用 Fluent NHibernate 来区分父关系的列

vb.net - 这个 C# FluentNHibernate 组件映射的等效 VB.NET 代码是什么?

c# - Cascade.All() EXCEPT Delete 是否有可能?

nhibernate - 使用 nHibernate 检索表中的所有记录

c# - 使用 FluentNHibernate NHibernate 3.3 的错误映射

nhibernate - NHibernate不删除子对象

nhibernate - 如何从FluentNHibernate生成hbm.xml文件