Nhibernate映射问题:类型为超类的属性

时间:2010-10-18 21:20:40

标签: nhibernate nhibernate-mapping

我有一个超级类的NHibernate对象(让我们称之为“超级”),以及一个从它继承的子类(比方说它叫做“Sub”)。

<class name="Super" table="SuperThings">
    <id name="Id" type="System.Int32" column="SuperId">
        <generator class="identity" />
    </id>

    <joined-subclass name="Sub" table="SubThings" extends="Super" lazy="true">
        <key column="SubId" />
    </joined-subclass>
</class>

我有一个单独的类(称为“Widget”),其属性为Super。

<class name="Widget" table="Widgets" lazy="true">
    <id name="Id" type="System.Int32" column="NoteId">
      <generator class="identity" />
    </id>
    <many-to-one name="SuperProperty" column="SuperId" class="SuperClass" />
</class>

当我在Widget的实例上访问SuperProperty时,NHibernate试图懒洋洋地加载它,但是我收到了这个错误:

找到了多个具有给定标识符的行:1,类:Super

SuperThings中只有一条id为1的记录,以及与之关联的SubThings中的单独记录。在使用NHibernate Profiler并调试我的代码后,看起来NHibernate试图实例化一个类型为子类的对象。

为什么这样做?我认为这应该如何映射是否有问题?

显然,这是我实际使用的简化版本。我正在使用的对象具有更多不同类型的属性,所以也许我已经忽略了实际导致问题的原因,但我想确保我至少在基本层面上理解事物。

1 个答案:

答案 0 :(得分:2)

如果SuperThings中有Id = 1的记录,SubThings中有一条SubId = 1的记录,根据你的映射你有一个Sub实例,所以当它试图实例化时,NHibernate是正确的。

如果这不符合您的意图,您应该重新阅读Chapter 8. Inheritance Mapping以查看备选方案。