延迟加载协会和铸造
我使用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是公共财产还是私人领域?因为代理需要覆盖其获取...
是的,StrategyBusinessDriver也是一个BusinessObject。 我附上上面的映射文件。 _data是一个私人字段。但是,它是一个字典,用于映射动态组件。(我有动态列) – Zuber 2010-03-20 09:19:16
我不知道如何附加一个文件,并且代码标记中没有接受整个映射文件 – Zuber 2010-03-20 09:24:46