延迟加载协会和铸造

问题描述:

我使用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> 

我想我得到了这个问题的底部。 因为我试图懒惰地读取同一对象内的对象的属性,所以不能够懒惰地加载这些属性。 当我使用扩展方法移出代码时,属性的读取不在同一个对象的范围内,这就是它工作的原因。

是StrategyBusinessDriver一个BusinessObject的?你可以发布你的映射吗? _data是公共财产还是私人领域?因为代理需要覆盖其获取...

+0

是的,StrategyBusinessDriver也是一个BusinessObject。 我附上上面的映射文件。 _data是一个私人字段。但是,它是一个字典,用于映射动态组件。(我有动态列) – Zuber 2010-03-20 09:19:16

+0

我不知道如何附加一个文件,并且代码标记中没有接受整个映射文件 – Zuber 2010-03-20 09:24:46