私は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 に戻すことができますが、これもちょっとしたハックのように思えます。