我正在使用nHibernate,我有3个映射类--A,B,C。类A看起来如下:
public class A
{
public virtual string StringProp1 { get; set; }
public virtual string StringProp2 { get; set; }
public virtual B BProp { get; set; }
public virtual C CProp { get; set; }
}
一切正常,但我想做的是一些优化。我的目的是有可能动态指定应该加载哪些属性(来自DB)。所以我不能在映射中将某些属性标记为惰性。我认为它的工作方式如下:
ICriteria criteria = session.CreateCriteria<A>();
criteria.SetProjection(Projections.ProjectionList()
.Add(Projections.Property("StringProp1"), "StringProp1")
.Add(Projections.Property("BProp"), "BProp"));
criteria.SetResultTransformer(Transformers.AliasToBean<A>());
return criteria.List<A>();
但这对参考类型属性(如BProp)不起作用,即使我将为条件添加别名。我在最后一行得到'索引超出了数组的范围'。
如果我删除添加了BProp投影的行,这将起作用并返回A类的实例,其中只有StrinProp1被赋值。但我想将相应的B类实例加载到BProp中。
有什么建议吗?
答案 0 :(得分:0)
听起来不是正确的做事方式。如果您正在尝试加载BProp,那么您应该采取以下措施:
criteria.SetFetchMode("BProp", SetFetchMode.Eager);