2010-12-02 5 views
6

LINQ to Sqlでは、指定したフェッチに対して、特定の子要素を読み込む(熱心にまたは遅延しない)ように指定できます。これはNHibernateで可能ですか?ルートオブジェクトやオブジェクトグラフの一部だけが必要な時があります。私はDTOを記述する必要がなく、NHibernateが感じている事実を回避するためにマッピングするのではなく、指定することができます。私は私のオブジェクトをシリアル化しようとするとすべてをロードするように強制されました。NHibernateで遅延ロードを選択的にオフにすることはできますか?

ありがとうございます!

答えて

5

はい、しかし...

あなたがここに持っている柔軟性のレベルは、NHibernateはのバージョンに依存してもよいし、どのようにあなたのクエリを構築しています。たとえば、LINQクエリ(ここではバージョン管理の違いがあります)は、ICriteriaまたはHQLクエリと同じ柔軟性を提供しません。

条件APIを使用すると、を呼び出して、そのクエリのプロパティとモードを渡すことができます。

NHibernateは、投影を作成することもできるため、マップされていない型やDTOのオブジェクトをマッピングせずにインスタンス化することができます。もちろん、投影は一方通行に過ぎません。マップされていなければ、永続化することはできません。

+0

これは私が探しているものです - ありがとう。私はコレクションでハードコーディングするのではなく、リクエストごとにこれを実行したいと思います。 – sydneyos

2

ジェイは、すでに述べたすべてのものに加えて、あなたはクラスレベルでそれを指定することができます...あなたのマッピングファイルに怠惰を指定することができます。

<property Name="Bar" lazy="true"/> 
<set Name="Bars" lazy="true"> <-- makes the collection lazy 
<set Name="Bars" fetch="join"> <-- eagerly fetches child items in the collection 
<set Name="Bars" fetch="select"> <-- fetches items via another select when the collection is accessed for the first time 
<class name="Foo" lazy="true"> 
    <!-- additional data --> 

またはプロパティ/コレクションレベルで

これらのデフォルトは、特定のクエリに対して上書きすることができ、HQLでは無視されます。

関連する問題