延迟加载关联和转换

时间:2010-03-19 07:33:23

标签: nhibernate lazy-loading

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

2 个答案:

答案 0 :(得分:0)

是StrategyBusinessDriver的BusinessObject?你可以张贴你的地图吗? _data是公共财产还是私人领域?因为代理需要覆盖其getter ......

答案 1 :(得分:0)

我想我已经掌握了这个问题的根源。 由于我试图在同一个对象中懒惰地读取属性,因此无法懒惰地加载这些属性。 当我使用扩展方法移出该代码时,属性的读取不在同一对象的范围内,这就是它工作的原因。