Nhibernate 延迟加载关联和强制转换

Nhibernate 延迟加载关联和强制转换,nhibernate,lazy-loading,Nhibernate,Lazy Loading,我使用的是NHibernate2.0.1和.NET 我面临延迟加载关联的问题 我有一个BusinessObject类,它与其中的其他BusinessObject有关联,它可以更深入 以下函数位于BusinessObject中,用于读取BusinessObject中集合的值 public virtual object GetFieldValue(string fieldName) { var fieldItems = fieldName.Split(AppConst

我使用的是NHibernate2.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());
    }  
BusinessObject有一个存储字段值的dictionary\u数据

假设字段名为BusinessDriver.Description,包含此字段的BusinessObject为StrategyBusinessDriver

此代码将字段名称分为两部分-BusinessDriver和Description。 第一次迭代从StrategyBusinessDriver读取BusinessDriver对象。 它被转换为BusinessObject类型,以便我可以再次调用它的GetFieldValue来读取下一个字段,即BusinessDriver中的描述

问题是,当我在第一次迭代中读取BusinessDriver并将其转换时,我获得了BusinessObject的ID和所有其他详细信息,但没有获取字段dictionary\u数据和其他集合。当我读取BusinessObject的_数据时,应该懒洋洋地获取它。 但是,这并没有发生,我得到一个错误,即_data为null

是否有错误编码的内容导致集合无法延迟获取? 如果需要,请要求更多的澄清。 提前谢谢

更新: 我对这个问题有了更多的了解。 如果在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>

StrategyBusinessDriver是BusinessObject吗?你能发布你的地图吗?_数据是公共财产还是私有字段?因为代理需要覆盖它的getter…

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

是的,StrategyBusinessDriver也是一个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>