NHibernate の値オブジェクトの別のテーブル
-
19-09-2019 - |
質問
私は DDD と NHibernate を初めて使用します。
現在のプロジェクトには、値オブジェクト、たとえば Address を含むエンティティ person があります。今日はこれで大丈夫です。しかし、いつか、値オブジェクト (この場合は Address) をエンティティにする必要があるという要件が生じるかもしれません。
これを DDD 方式でモデル化する前に、よりデータ中心のアプローチで、Id を持つテーブル person と、実際には PK である FK である別のテーブル Address を用意していました。これは人の ID でした (つまり、 、1 対 1 の関係)。
値オブジェクトをコンポーネントとしてマップすると、その値はエンティティ テーブルの列としてマップされることを読んでいました (したがって、1 対 1 の関係はありません)。
私の考えは、必要に応じて代理キーをアドレス テーブルに追加するだけで、それがエンティティになるというものでした。
NHibernate を使用してこれをどのように設計すればよいでしょうか?すでにアドレス オブジェクトをエンティティにしておく必要がありますか?
申し訳ありませんが、質問が明確かどうかさえわかりません。ここで本当に迷っています。
解決
私たちが構築しているシステムでは、値オブジェクトを別のテーブルに配置します。私の知る限り、NHibernate では次のことが必要です。 id
をオブジェクトに追加する必要がありますが、これを無視し、オブジェクトをシステム内の値オブジェクトとして扱います。おそらくご存知のとおり、値オブジェクトは追跡する必要のないオブジェクトであるため、単純に無視されます。 id
オブジェクトの中で。これにより、データベースを希望どおりにモデル化したり、ドメイン モデルを希望どおりにモデル化したりすることがより自由になります。
他のヒント
これを結合してコンポーネントにすることができ、nHibernate がそれをエンティティではなく適切な値オブジェクトとしてマップできるようになります。
この方法では、仮想プロパティも空の保護された ctor (プライベートにすることもできます) も必要なくなります。
Join("PROPOSAL_PRODUCT", product =>
{
product.Schema(IsaSchema.PROPOSALOWN);
product.KeyColumn("PROPOSAL_ID");
product.Component(Reveal.Member<Proposal, Product>("_product"), proposalProduct =>
{
proposalProduct.Map...
});
});