2010-03-19 66 views
0

我使用NHibernate的2.0.1和.NET 我與延遲加載的關聯延遲加載協會和鑄造

我有了協會等BusinessObject的在它BusinessObject的類面臨的問題,並能去更深。

以下函數在BusinessObject中讀取BusinessObject中集合的值。

public virtual object GetFieldValue(string fieldName) 
    { 
     var fieldItems = fieldName.Split(AppConstants.DotChar); 
     var objectToRead = this; 
     for (var i = 0; i < fieldItems.Length - 1; i++) 
     { 
      objectToRead = (BusinessObject) objectToRead.GetFieldValue(fieldItems[i]); 
     } 
     //if (objectToRead._data == null) return objectToRead.SystemId + " Error: _data was null"; 
     return objectToRead.FieldValue(fieldName.LastItem()); 
    } 

FieldValue功能下面

private object FieldValue(string fieldName) 
    { 
     return _data.Contains(fieldName) ? _data[fieldName] : null; 
    } 

BusinessObject描述具有字典_data存儲該字段值。

假設字段名是BusinessDriver.Description並具有該領域的BusinessObject的是StrategyBusinessDriver

此代碼打破了字段名分成兩個 - BusinessDriver & Description。 第一次迭代從StrategyBusinessDriver讀取BusinessDriver對象。 它被投入BusinessObject類型,以便我可以再次撥打GetFieldValue來讀取下一個字段,即BusinessDriver中的Description

問題是,當我在第一次迭代中讀取BusinessDriver並將其轉換時,我得到了Ids和BusinessObject的所有其他詳細信息,但是字段字典_data和其他集合未提取。當我讀取BusinessObject的_data時,應該會延遲讀取。 但是,這並沒有發生,我得到一個錯誤,_data爲空。

是否有某些錯誤的編碼,因爲它不會延遲取回集合? 如有需要,請索取更多說明。 在此先感謝。

更新: 我對問題有更深入的瞭解。 如果在BusinessObject內部遞歸調用函數,則加載BusinessObject字段的代碼不會被延遲加載。 如果我將這個邏輯移出BusinessObject,延遲加載的工作原理! 有沒有辦法讓它在BusinessObject中工作?

UPDATE:映射文件

<joined-subclass name="Japt.Core.Domain.Data.BusinessObject, Japt.Core, Version=0.0.1608.0, Culture=neutral, PublicKeyToken=null" table="BusinessObject_BusinessDriverStrategyMap" entity-name="BusinessDriverStrategyMap"> 
    <key column="SystemId" /> 
    <dynamic-component name="_data" insert="true" update="true" optimistic-lock="true"> 
    <many-to-one class="Japt.Core.Domain.Data.BusinessObject, Japt.Core, Version=0.0.1608.0, Culture=neutral, PublicKeyToken=null" name="Strategy" entity-name="Strategy"> 
     <column name="Strategy" /> 
    </many-to-one> 
    <many-to-one class="Japt.Core.Domain.Data.BusinessObject, Japt.Core, Version=0.0.1608.0, Culture=neutral, PublicKeyToken=null" name="BusinessDriver" entity-name="BusinessDriver"> 
     <column name="BusinessDriver" /> 
    </many-to-one> 
    </dynamic-component> 
    <dynamic-component name="_collections" insert="true" update="true" optimistic-lock="true" /> 
</joined-subclass> 

回答

0

我想我得到了這個問題的底部。 因爲我試圖懶惰地讀取同一對象內的對象的屬性,所以不能夠懶惰地加載這些屬性。 當我使用擴展方法移出代碼時,屬性的讀取不在同一個對象的範圍內,這就是它工作的原因。

0

是StrategyBusinessDriver一個BusinessObject的?你可以發佈你的映射嗎? _data是公共財產還是私人領域?因爲代理需要覆蓋其獲取...

+0

是的,StrategyBusinessDriver也是一個BusinessObject。 我附上上面的映射文件。 _data是一個私人字段。但是,它是一個字典,用於映射動態組件。(我有動態列) – Zuber 2010-03-20 09:19:16

+0

我不知道如何附加一個文件,並且代碼標記中沒有接受整個映射文件 – Zuber 2010-03-20 09:24:46