我正在使用NHibernate 2.0.1和.NET 我正面临着Lazy加载关联的问题
我有一个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
,用于存储字段值。
假设fieldName为BusinessDriver.Description
,并且具有此字段的BusinessObject为StrategyBusinessDriver
此代码将字段名称分解为两个 - BusinessDriver
&amp; Description
。
第一次迭代从BusinessDriver
读取StrategyBusinessDriver
对象。
它会被转换为BusinessObject
类型,以便我可以再次调用GetFieldValue
来阅读下一个字段,即Description
中的BusinessDriver
。
问题在于,当我在第一次迭代中读取BusinessDriver
并将其强制转换时,我得到了Ids和BusinessObject的所有其他细节,但字段字典_data
和其他集合未被获取。当我读取BusinessObject的_data时,应该懒惰地获取它。
但是,这不会发生,我收到_data为空的错误。
是否存在错误编码的内容,因为该内容未被懒惰地取出? 如有需要,请询问更多说明。 提前谢谢。
更新: 我对这个问题有了更深入的了解。 如果在BusinessObject内部递归调用函数,则不会延迟加载加载BusinessObject字段的代码。 如果我将此逻辑移出BusinessObject,则延迟加载有效! 有没有办法在BusinessObject中使用它?
更新:映射文件
<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是公共财产还是私人领域?因为代理需要覆盖其getter ......
答案 1 :(得分:0)
我想我已经掌握了这个问题的根源。 由于我试图在同一个对象中懒惰地读取属性,因此无法懒惰地加载这些属性。 当我使用扩展方法移出该代码时,属性的读取不在同一对象的范围内,这就是它工作的原因。