2010-03-16 53 views
1

我有一類結構像下面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; } 
} 

現在,當我在會話中尋找一個特定的容器通常它給我的具體EnemyBase,並在基地集合FriendlyBase對象。那麼我可以(如果我願意的話)將它們轉換成具體的類型,並對它們做一些特定的事情。

但是,有時候我得到了一個不能轉換爲具體類型的「Base」類的代理。同樣的方法同時使用,唯一的例外是在我得到代理的情況下,我已經將一些相關實體添加到會話中(認爲友好的基礎具有人員集合或類似的東西)。

有什麼辦法可以阻止它做代理創建,爲什麼它會選擇在某些情況下做到這一點?

UPDATE

的映射與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> 

UPDATE

當是這個樣子,現在我已經告訴NH從不延遲加載任何它automaps,不是理想的,如果我在未來需要的功能,但它似乎現在工作。

+0

你的映射是什麼樣的? – snicker 2010-03-16 16:22:08

回答

0

您可以將類型定義爲抽象類型嗎?這可能會給你一個錯誤,因爲nHibernate正在嘗試,但它可能會指向你「爲什麼」。

+0

我將它標記爲抽象,結果完全相同。 – 2010-03-16 16:13:38

1

據我所知,如果您使用myProxiedBase = Session.Load<Base>(myBase.Id)您將永遠得到一個基本對象的代理。如果你想要一個EnemyBase對象,你必須撥打Session.Load<EnemyBase<(myProxiedBase.Id)

檢查第17章中的文檔本節:

它說明了一點,比我能和可能的解決方法更好。

+0

在這種情況下,我得到了Container對象,而不是直接獲取「Base」類之一。通常情況下,收集填充具體的課程,除非我先在會話中做了其他事情。我只是不確定是什麼觸發它 – 2010-03-16 16:18:31

+0

如果您有其他對象引用了基礎對象並加載它們,它可能會將代理創建爲基礎對象並將它們緩存在會話中。我假設你懶惰加載你的實體? – snicker 2010-03-16 16:20:13

+0

在這種情況下,我已經告訴它不要因爲容器總是需要它的孩子(我現在只在一個頁面上使用它) – 2010-03-16 16:39:16