たとえば、2つのテーブルProduct
とOrder
があるとします。製品はID
,Name
,Description
,Cost
などの詳細な列を持ちます。注文にはID
とProductID
の列があります(注文には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と名前を取得できるようにしたいと考えています。
これがJOINに当てはまるかどうかはわかりません。個々の遅延プロパティは、特定の行から選択データを読み込む場合に適用されるようです。私は行に関連付けられた小さなデータセットを取得することにもっと関心がありますが、関連する完全なレコードではありません。私が自分の質問をしなければならないように思えます(これは、私が複数のテーブルに従いたいパターンなので、残念です)。 – Travis
@Travis:それは怠惰な財産です。いくつかの列を遅延ロードするように定義します。あなたは別のオプションを持っています(本当に醜いですが)。テーブルを2回マップすることができますので、フルセットのカラムと1セットの縮小セットしか得られません。 '.Inner.JoinAlias(()=> orderLine.ProductReducedSet、()=> product)' – LeftyX
私は質問をより具体的な例で更新しました。 – Travis