NHibernate子类与连接表与子类问题包

时间:2011-02-23 14:51:54

标签: nhibernate nhibernate-mapping

你好 我有一个这种类型的模型

public abstract class BaseEntity
{
    public Guid Id {get; set;}
}

class EntityA : BaseEntity
{
    ..other properties..
    IList<EntityB> BEntities {get; set;}
}

class EntityB : BaseEntity
{
    ..other properties..
    EntityA Owner {get, set;}
}

映射如下:

  <class name="BaseEntity" abstract="true" table="TBL_BaseEntity"
         dynamic-insert="true" dynamic-update="true" lazy="true" >
    <id name="Id"
        column="ID_ENTiTY"
        type="guid"
        unsaved-value="00000000-0000-0000-0000-000000000000">
      <generator class="guid.comb" />
    </id>

    <discriminator column="EtityType" type="string" force="true" />
  </class>

<subclass name="EntityA"
            extends="BaseEntity"
            discriminator-value="A"
            dynamic-insert="true"
            dynamic-update="true"
            lazy="true">

    <join table="TBL_ENTITYA">
      <key column="ID_ENTITYA" />

      ...other mapped properties...

      <bag name="BEntities" cascade="save-update"
           lazy="true" inverse="true" fetch="select" outer-join="true" >
        <key column="ID_ENTITYA" />
        <one-to-many class="EntityB"/>
      </bag>
    </join>
  </subclass>

<subclass name="EntityB"
            extends="BaseEntity"
            discriminator-value="B"
            dynamic-insert="true"
            dynamic-update="true"
            lazy="true">

    <join table="TBL_ENTITYB">
      <key column="ID_ENTITYB" />

      ...other mapped properties...

      <many-to-one name="Owner" not-null="true"
                   lazy="proxy" fetch="select" column="ID_ENTITYA" />
    </join>
  </subclass>

现在的问题是,当我尝试插入并级联一个新的EntityA,其中EntityB的集合已正确初始化(就双向关联而言)一切正常, 但是当我尝试读取EntityA.BEntities集合时,我得到了一个异常,表明NH可以执行查询。 在使用NHProf解决问题后,我看到生成的查询不正确,因为NH将列ID_ENTITYA附加到基表(显然没有该列)而不是 目标已加入子类表。 任何人都可以帮我解决这个问题吗? 我该如何避免这种行为? NH可以这样做吗?

提前致谢。

2 个答案:

答案 0 :(得分:1)

我们在这里遇到了同样的问题,我的同事找到了这个解决方案:

在EntityB上创建一个多对一的双向关系,返回到EntityA。

这似乎有助于NH弄清楚EntityA&amp; A之间存在FK关系。 EntityB,而不是BaseEntity&amp; EntityB。

希望这有帮助。

答案 1 :(得分:0)

我最近遇到了同样的问题并提交了一个问题:

https://nhibernate.jira.com/browse/NH-2564

相关问题