2011-10-06 16 views
3

私はNHibernateはを使用していると私は3つのマップされたクラスをしました - A、B、CのクラスAには、次のようになります。NHibernateは:投影と参照型のプロパティ

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; } 
} 

すべてが正常に動作しますが、何Iいくつかの最適化がしたいと思います。私の目的は、どのプロパティを(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の射影を追加する行を削除すると、これは動作し、StrinProp1だけがvalueで埋められるAクラスのインスタンスを返します。しかし、私はBクラスの対応するインスタンスをBPropにロードしたいと思っています。

提案がありますか?

答えて

0

物事を行う正しい方法のようには聞こえません。あなたは熱心な負荷BPropにしようとしている場合は、あなたのような何かをする必要があります。

私は、BPropとStringProp1プロパティをロードしたい
+0

criteria.SetFetchMode("BProp", SetFetchMode.Eager); 
ではなくのcpropとStringProp2(結果のSQL文を単純にするためにともっと早く)。私はFetchModeが私が探しているものだとは思わない。 – mayor