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

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

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

0

1 答え

基本的に、あなたがやろうとしていることは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を読み込むための同様のメソッドを持つことができます。

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

1
追加された
@randoms:あなたは何を意味するのか分かります。長い話が短い。不可能です。この問題を克服する方法をいくつか考えてください。
追加された 著者 k.m,
私はそれほど得意ではありませんでした。 Fooのリクエストをすると、関連するFoo.Barsが自動的に取得されます。なぜなら、HasMany(x => x.Bars)というマッピングがあるからです.Not.LazyLoad();私のFooマッピングファイルで。そして、はい、私が書いたように、私はWCFサービスを使用します。
追加された 著者 randoms,