0

私はCastle ActiveRecordを使用していますが、NHibernateで動作するソリューションはActiveRecordでも動作するはずなので、この質問はNHibernateにも当てはまります。とにかく、私が持っているのは、次のような基本的なテーブル構造です:

TableA -hasMany-> TableB

対応するオブジェクト EntityA と EntityB があります。EntityA には EntityB オブジェクトの IList があります。この部分は正常に動作します。ここで、EntityB に EntityA への何らかの参照を持たせたいと考えています。次のように、EntityB の BelongsTo 属性を使用して、完全な EntityA 型への実際の参照を返すことができることを私は知っています。

[BelongsTo("tableAid")]
public EntityA Parent { get; set; }

しかし、私が本当にやりたいことは次のとおりです。

[BelongsTo("tableAid")]
public int ParentId { get; set; }

したがって、EntityB は、実際のオブジェクトへの参照ではなく、親オブジェクトの ID のみを格納します。これは些細な例ですが、このアプローチを採用したいのには十分な理由があります。私が取り組んでいるアプリケーションには、特定の EntityB のようなオブジェクトを表示するページがあり、それらのページに、対応する親ページへのリンク (ハイパーリンクなど) を含めたいと考えています。上記の最初のアプローチを使用してこれを行うことができますが、本当に必要なのは ID だけである場合、EntityA オブジェクト全体を読み込む必要があります。大したことではありませんが、無駄に思えます。遅延読み込みを使用できることはわかっていますが、これもハックのように思えます...

次のように [Property] 属性を使用して外部キーにフラグを立てようとしました。

[Property]
public int ParentId { get; set; }

このアプローチの問題は、新しいオブジェクト ツリーで EntityA.SaveAndFlush() を実行すると、EntityB.ParentId が null のままになることです。正しい値がデータベースに書き込まれており、EntityA.Refresh() を実行することで値を強制的に EntityB.ParentId に戻すことができますが、これもちょっとしたハックのように思えます。

4

2 に答える 2

2

遅延読み込みはまさにあなたが望むものです - それはハックでもありません.NHIbernateの一部で十分にテストされ、焼き付けられており、実質的なNHibernateアプリのパフォーマンスを調整するときの重要なツールです.

「親」の EntityA を遅延読み込みとしてマークした場合、EntityB.Parent.Id を参照しても EntityA はまったく読み込まれません (舞台裏で NHIbernate は EntityB の読み込み時に EntityA の ID を既に読み込んでいるため)。パフォーマンスのペナルティが発生します。

于 2009-05-03T11:57:23.820 に答える
0

これだけ:

[Property] public int ParentId { get; set; }

...仮定ParentIdは実際の列名です。

他のいくつかのコメント。

まず、とにかく、多対 1 のプロパティを遅延読み込みすることを検討する必要があります。それらを積極的にロードする場合は、重大なパフォーマンス ヒットを引き起こす可能性のある積極的なロードのカスケードに注意する必要があります。これを行うには、遅延ロードされたクラスのすべてのパブリック メンバーを仮想としてマークする必要があります。

次に、子から親への対応するリレーションがない 1 対多の関連付けがある場合は常に、データベースで FK を null 許容にする必要があることに注意してください。これは、NH が新しい子アイテムを作成するときに、親 ID を null にして挿入し、2 番目のステップでそれを更新するためです。

于 2008-10-29T14:22:55.370 に答える