我有类似以下的类结构
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从不懒惰加载它自动化的任何东西,如果我将来需要这个功能但是它似乎现在正在工作,这并不理想。
答案 0 :(得分:1)
据我了解,如果您使用myProxiedBase = Session.Load<Base>(myBase.Id)
,您将始终获得Base对象的代理。如果你想要一个EnemyBase对象,你必须再次打电话给Session.Load<EnemyBase<(myProxiedBase.Id)
。
检查文档中的第17章的这一部分:
它解释得比我更好,可能的解决方法。
答案 1 :(得分:0)
您可以将类型定义为抽象吗?这可能会给你一个错误,因为无论如何nHibernate正在尝试,但它可能会指向你“为什么”。