2009-08-25 1 views
4

私はDDDとNHibernateを初めて使いました。NHibernate上のバリューオブジェクトのための別のテーブル

私の現在のプロジェクトでは、値オブジェクトを含むエンティティPersonを持っていますが、Addressとしましょう。今日、これは問題ありません。しかし、ある日、私の価値オブジェクト(このケースではAddress)がエンティティになる必要があるという要件があります。

これをDDDの方法でモデル化しようとする前に、よりデータ中心のアプローチでは、Idを持つテーブルPersonと、実際にFKだった別のテーブルAddressを持っていました。 Person(すなわち、1対1の関係)。

バリューオブジェクトをコンポーネントとしてマップすると、その値がエンティティテーブルの列としてマップされます(つまり、1対1の関係はありません)。

私の考えは、必要なときに私のアドレステーブルにサロゲートキーを追加するだけで、エンティティになりました。

NHibernateを使用してこれをどのように設計する必要がありますか? Addressオブジェクトを既にエンティティにする必要がありますか?

申し訳ありませんが、私の質問が明確であれば、私は本当にここで失われています。

答えて

4

私たちが構築しているシステムでは、バリューオブジェクトを別々のテーブルに配置します。私が知る限り、NHibernateはidをオブジェクトに追加する必要がありますが、これを無視してオブジェクトをシステム内のバリューオブジェクトとして扱います。ご存じのように、バリューオブジェクトはトラッキングする必要のないオブジェクトなので、オブジェクト内のidを見落とすだけです。これにより、データベースを自由にモデル化し、必要な方法でドメインモデルをモデル化することができます。

+0

ここでも同じアプローチです。 dddはオブジェクトにidというプロパティを持たせるべきではないことを要求しません。値オブジェクトはアイデンティティーのないオブジェクトです。 –

+0

Hmmm、私はそれを隠すように、保護されたIDを作成することはできますが、NHibernateはまだそれを表示し、マップすることができますか? –

+2

しかし、値オブジェクトテーブルに繰り返し入力することになります。それを避ける方法は? – Seiti

0

nHibernateに参加させて、それをnHibernateがエンティティではなく適切な値オブジェクトとしてマッピングできるようにすることができます。

この方法では、仮想プロパティも空の保護されたctor(プライベートにすることもできます)は必要ありません。

Join("PROPOSAL_PRODUCT", product => 
{ 
    product.Schema(IsaSchema.PROPOSALOWN); 
    product.KeyColumn("PROPOSAL_ID"); 

    product.Component(Reveal.Member<Proposal, Product>("_product"), proposalProduct => 
    { 
     proposalProduct.Map... 
    }); 
}); 
関連する問題