HasMany関係をプログラムで無視しますか?


こちら
の質問にフォローアップの質問があります。

私はSilverlightとWCFを使用していますが、lazyloadingはオプションではありません。
HasMany関係をプログラムで無視して、パフォーマンスを向上させることができますか?
(私はちょうど関連するバーのないFooのが欲しい)。

ベストアンサー

基本的に、あなたがやろうとしていることはNHibernateでもFluentでも可能ではありません。
「時々ロードする、時にはない」というマッピングを持つことはできません。
Not.LazyLoad()を設定すると、 show stopper
になります。 – NHibernateは常にコレクションを読み込みます。

でこれらの種類の最適化(読み込み、時には)が適している場合があります。 DAO
の一部です。例えば、あなたの FooDao クラスは次のようになります:

public class FooDao
{
    public IList GetFoosEagerly()
    {
       //load all Foos first; then all Bars for every Foos
        var foos = session.QueryOver().List();
        foreach (var foo in foos)
        {
            NHibernateUtil.Initialize(foo.Bars);
        }

        return foos;
    }

    public IList GetFooPerformanceCritical()
    {
        return session.QueryOver().List();
    }
}

Not.LazyLoad()を使用して not
のような標準的なマッピングを使用して)最初のメソッドは、Barsコレクションが完全に設定されたFoosを返します(NHibernateにロード今、私たちが戻る前に)。しかし、2番目のオブジェクトは
Foo オブジェクトをのみ返します。単一の
Bar はロードされません。代わりに、Hibernateはすべての Foo
のBarsコレクションの代わりにプロキシオブジェクトを生成します。

WCFサービスは、このようなDAOオブジェクトを内部的に使用できます。当然のことながら、単一のFooを読み込むための同様のメソッドを持つことができます。

結論は簡単です。マッピングだけでは問題の解決には役立ちません。余分なコーディング作業をする必要がありますが、間違いなく可能です。

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です