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如果您有其他对象引用了基本对象并加载了它们,它可能会将代理创建为基本对象并在会话中缓存它们。我假设您是懒惰地加载实体?在这种情况下,我告诉它不要这样做,因为容器总是需要它的子对象(我现在只在一个页面上使用它),您的映射是什么样子的?您的映射是什么样子的?