0

私はNHibernateの初心者です。where句に基づいて従業員のすべての関連付けを設定するには、「従業員」などの複雑なクエリを作成する必要があります。私が探しているのはこれに似ています - Employee.FindById(10) を実行すると、OwnedDepartment、SubscribedGroups などを埋める必要があります。

作成する必要がある Employee モデルは非常に重い (他のオブジェクトとの関連付けが多い) のですが、作成する必要がある関連付けはごくわずかです。クエリオーバーを使用してそれを達成するにはどうすればよいですか? または他のアプローチ?


更新しました

今、熱心な読み込みについて読んでいましたが、それは読み込みと関係がありますか? 私のマップでは、ロード方法について言及していないため、デフォルトでは、従業員のすべての子要素が既にロードされています。その下でトリガーされるクエリがたくさんあります。

4

1 に答える 1

0

デフォルトでは、すべての関連付けが遅延ロードされます。つまり、アクセスすると負荷がトリガーされます。そのため、非常に多くのクエリが発行されます。データを熱心にロードする場合 (つまり、テーブルを結合するか、まれに追加の選択クエリを一度に実行することを意味します)、データのフェッチ方法に応じて、マッピングまたはクエリでそれを指定する必要があります。この概念は一般に「eager fetching」と呼ばれます。

EmployeeID で単一のものを取得したい場合、それを行う標準的な方法はsession.Get<Employee>(10)- を使用することですが、このアプローチは、マッピングで熱心な読み込みを指定する必要があることを意味します。コードによるマッピングの場合はc.Lazy(CollectionLazy.NoLazy);、コレクションまたはc.Lazy(LazyRelation.NoProxy)多対 1 になります。詳細については、こちらまたはこちらを参照してください。

私はクエリでそのようなことを指定することを好みます-誰が何のためにフェッチしているかに関係なく、エンティティ全体に対してグローバルではなく、使用される場所だけです。LINQ プロバイダーにはFetchMany(x => x.SubscribedGroups)、コレクションと多対Fetch(x => x.OwnedDepartment)1 の関係があります。必要に応じて、QueryOver にも同様のオプションがあります。

于 2013-09-26T19:10:17.447 に答える