2009-06-10 11 views
0

私のドメイン駆動型デザインでは、Carというエンティティがあります。ホイール。エンティティとNHibernateの永続性を含むドメイン駆動型デザイン

ここで、車のエンティティにChangeWheelメソッドを追加します。車輪を変更しても、実際に車のエンティティが変更されるわけではありません。ホイールコレクションのエンタイトの1つにのみ影響します。私。 CarエンティティにはIList属性があります。私のデータベーススキーマでは、私は車輪の参照を持っていない車のエンティティを持っている - むしろ、車輪のテーブルはCarIdの外部キーを持っています。

私は車の車輪を変更すると、特定の車輪のレコードを更新します。私が更新したい唯一の他のテーブルは、データベース内のバージョン監査テーブルです。

NHibernate経由でリポジトリからCarエンティティを抽出し、ChangeWheel(...)をコールして再度セーブすると、NHibernateがカーレコードの新しいバージョンを保存しないように設定できますか?

これはすべて意味があることを願っています。

+0

良いORMは、レコードのデータが実際に変更された場合にのみデータベーステーブルにデータを保存する必要があります。 –

答えて

1

NHibernateは、Iesi.Collections.Generic.ISetから派生した独自のコレクションを持つコレクション(ケースのホイールのような)であるプロパティをラップします。これが完了すると、コレクションの変更を追跡できます。これはもちろん、必要な更新のみを発行することを意味します。

この場合、ホイールにEqualsとGetHashCodeを実装する必要があります。ここでは等しく、GetHashCodeメソッドの実装上のブログの記事です:

Implemeting Equals and GetHashCode

1

NHibernateのは当然これを行います。あなたは、既存のマッピングを持っていますか、これはちょうど何か仮説ですか? NHibernate docsから

+0

ちょうどこの時点で何か仮説的です。私はNHibernateを検討している新しいプロジェクト。 – ng5000

1

は:

  • 我々はコレクションに/ からオブジェクトを追加/削除

    、 コレクションのオーナーのバージョン番号はインクリメントされます。

しかし...あなたが新しく追加されたWheelを永続化しようとすることができますが、ないCar自体を持続。これは望ましい効果を与えるはずですが、NHibernateは常に汚れているとみなします(ISessionの管理を参照してください)

+0

ありがとうございます - nhibernateで作業する場合、すべてのエンティティ(/両方のビジネスオブジェクトとDBテーブル)にバージョン番号の列/フィールドが必要ですか? – ng5000

+0

いいえバージョン番号は楽観的なロックに使用されます。 –

関連する問題