2011-08-05 9 views
0

たとえば、2つのテーブルProductOrderがあるとします。製品はID,Name,Description,Costなどの詳細な列を持ちます。注文にはIDProductIDの列があります(注文には1つの商品のみが含まれているとします)。NHibernateで外国の自然キーを熱心に読み込むことはできますか?

注文をシステムに表示する際に、他のすべてのデータを含まない関連商品名を表示することもできます(つまり、注文とその関連商品名を熱心に読み込み、製品プロパティ):

NHibernateでこれを行う場合、2つの選択肢があります。熱心な読み込みまたは遅延読み込みです。積極的なロードで

、私のようなものを得る:遅延ロードで

SELECT o.ID, o.ProductID, p.ID, p.Name, p.Description, p.Cost, p.... FROM Order JOIN Product p ON o.ProductID=p.ID 

を、私のような何かを得る:

SELECT o.ID, o.Product ID from Order 
.... 
SELECT p.Name, p.Description, p.Cost, p.... FROM Product p WHERE p.ID=? 

を更新

ここでのより具体的な例であります私が達成しようとしていること。私は既存のDALと一緒に作業しており、NHibernateを統合しようとしています。現在のDALの機能の1つは、親レコードの一部としていくつかの基本的な外部キー情報の検索を可能にすることです。 UserテーブルとRegionテーブルがあるとします。各ユーザーには、その地域に属している外部キーがあります。 GUIにユーザー情報を表示する際には、ユーザーにリージョン名を表示する必要がありますが、リージョンに関するその他の詳細は必要ありません。

現在のDALでは、UserドメインオブジェクトのメンバーはForeignKeyReference<Region>です。

public class ForeignKeyReference<T> 
{ 
    public virtual int ForeignKeyID { get; set; } 
    public virtual string ForeignNaturalKey { get; set; } 
    public virtual T Reference { get; set; } 
} 

Userをデータベースから取得された場合、Regionのプライマリと自然キーも取得され、そしてReferenceがプロキシオブジェクトに設定されています。 NHibernateでこれを単純化したいが、この機能を維持する。たとえば、ForeignKeyReference<Region>のメンバを削除し、NHibernateプロキシであるRegionメンバを持っています。このプロキシでは、再度データベースにヒットすることなく、IDと名前を取得できるようにしたいと考えています。

答えて

0

特定の列を遅延としてマークすることができます。昨年のこの新機能については、 Ayende wroteです。

私はあなたがが、この機能についてHibernateドキュメントを読むことをお勧めします:

Hibernate3では個々のプロパティの遅延フェッチをサポートしています。この 最適化手法は、フェッチグループとも呼ばれます。 これは主にマーケティング機能です。行の読み込みを最適化することは、列の読み込みを最適化するよりもはるかに重要です。 しかし、極端な場合には、クラスのいくつかのプロパティをロードするだけで便利な場合があります。 の例では、レガシーテーブルに数百の列があり、データ モデルを改善することはできません。

他の代替は、独自のクエリをクレアーレすることです:

Session.CreateQuery 

このanswerを見てください。

+0

これがJOINに当てはまるかどうかはわかりません。個々の遅延プロパティは、特定の行から選択データを読み込む場合に適用されるようです。私は行に関連付けられた小さなデータセットを取得することにもっと関心がありますが、関連する完全なレコードではありません。私が自分の質問をしなければならないように思えます(これは、私が複数のテーブルに従いたいパターンなので、残念です)。 – Travis

+0

@Travis:それは怠惰な財産です。いくつかの列を遅延ロードするように定義します。あなたは別のオプションを持っています(本当に醜いですが)。テーブルを2回マップすることができますので、フルセットのカラムと1セットの縮小セットしか得られません。 '.Inner.JoinAlias(()=> orderLine.ProductReducedSet、()=> product)' – LeftyX

+0

私は質問をより具体的な例で更新しました。 – Travis

関連する問題