NHibernate代理创建

时间:2010-03-16 15:48:54

标签: nhibernate

我有类似以下的类结构

class Container
{
    public virtual int Id { get; set; }
    public IList<Base> Bases { get; set; }
}

class Base
{
    public virtual int Id { get; set; }
    public virtual string Name { get; set; }
}

class EnemyBase : Base
{
    public virtual int EstimatedSize { get; set; }
}

class FriendlyBase : Base
{
    public virtual int ActualSize { get; set; }
}

现在,当我向会话询问特定的Container时,它通常会在Bases集合中为我提供具体的EnemyBase和FriendlyBase对象。然后我可以(如果我这样选择的话)将它们投射到具体的类型并做一些特定的事情。

但是,有时我得到了一个不能转换为具体类型的“Base”类的代理。两次都使用相同的方法,唯一的例外是在我获得代理的情况下,我已经在会话中添加了一些相关的实体(认为友好的基础有一组人或类似的东西)。

有什么方法可以阻止它进行代理创建,为什么会在某些情况下选择这样做呢?

更新

映射是使用fluentnhibernate的automap功能生成的,但在导出时看起来像这样

<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" mutable="true" name="Base" table="`Base`">
    <id name="Id" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <column name="Id" />
      <generator class="MyIdGenerator" />
    </id>
    <property name="Name" type="String">
      <column name="Name" />
    </property>

    <joined-subclass name="EnemyBase">
      <key>
        <column name="Id" />
      </key>
      <property name="EstimatedSize" type="Int">
        <column name="EstimatedSize" />
      </property>

    </joined-subclass>
    <joined-subclass name="FriendlyBase">
      <key>
        <column name="Id" />
      </key>
      <property name="ActualSize" type="Int">
        <column name="ActualSize" />
      </property>

    </joined-subclass>
  </class>
</hibernate-mapping>

<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" mutable="true" name="Container" table="`Container`">
    <id name="Id" type="System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <column name="Id" />
      <generator class="MyIdGenerator" />
    </id>
    <bag cascade="all-delete-orphan" inverse="true" lazy="false" name="Bases" mutable="true">
      <key>
        <column name="ContainerId" />
      </key>
      <one-to-many class="Base" />
    </bag>  
  </class>
</hibernate-mapping>

更新

我现在已经告诉NH从不懒惰加载它自动化的任何东西,如果我将来需要这个功能但是它似乎现在正在工作,这并不理想。

2 个答案:

答案 0 :(得分:1)

据我了解,如果您使用myProxiedBase = Session.Load<Base>(myBase.Id),您将始终获得Base对象的代理。如果你想要一个EnemyBase对象,你必须再次打电话给Session.Load<EnemyBase<(myProxiedBase.Id)

检查文档中的第17章的这一部分:

它解释得比我更好,可能的解决方法。

答案 1 :(得分:0)

您可以将类型定义为抽象吗?这可能会给你一个错误,因为无论如何nHibernate正在尝试,但它可能会指向你“为什么”。