NHibernate代理创建

NHibernate代理创建,nhibernate,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 { p

我有如下的类结构

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; }
}
类容器
{
公共虚拟整数Id{get;set;}
公共IList基{get;set;}
}
阶级基础
{
公共虚拟整数Id{get;set;}
公共虚拟字符串名称{get;set;}
}
类EnemyBase:Base
{
公共虚拟int EstimatedSize{get;set;}
}
类FriendlyBase:Base
{
公共虚拟int实际值{get;set;}
}
现在,当我向会话请求特定容器时,它通常会在Bases集合中提供具体的EnemyBase和FriendlyBase对象。然后,我可以(如果我选择的话)将它们转换为具体的类型,并对它们做一些特定的处理

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

我有没有办法阻止它创建代理,为什么在某些情况下它会选择这样做

更新

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

<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不要延迟加载它自动映射的任何东西,如果我将来需要该功能,这并不理想,但它现在似乎正在工作。

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

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

据我所知,如果您使用
myProxiedBase=Session.Load(myBase.Id)
您将始终获得一个基对象的代理。如果您想要一个EnemyBase对象,您必须再次调用我所理解的
Session.Load,如果您使用
myProxiedBase=Session.Load(myBase.Id)
您将始终获得一个基本对象的代理。如果需要EnemyBase对象,则必须再次调用
Session.Load。在本例中,我将获取容器对象,而不是直接获取其中一个“基本”类。通常情况下,除非我在会话中先做了其他事情,否则集合中会充满具体的类。我只是不确定是什么触发了ITI如果您有其他对象引用了基本对象并加载了它们,它可能会将代理创建为基本对象并在会话中缓存它们。我假设您是懒惰地加载实体?在这种情况下,我告诉它不要这样做,因为容器总是需要它的子对象(我现在只在一个页面上使用它),在这种情况下,我得到的是容器对象,而不是直接得到一个“基”类。通常情况下,除非我在会话中先做了其他事情,否则集合中会充满具体的类。我只是不确定是什么触发了ITI如果您有其他对象引用了基本对象并加载了它们,它可能会将代理创建为基本对象并在会话中缓存它们。我假设您是懒惰地加载实体?在这种情况下,我告诉它不要这样做,因为容器总是需要它的子对象(我现在只在一个页面上使用它),您的映射是什么样子的?您的映射是什么样子的?