設定によりどちらのモ,DTOsとNonUniqueObjectException
-
21-08-2019 - |
質問
我々のDTOパターンに整理当社のドメインからのサービス層へのリポジトリ、そのデータベース経由で設定によりどちらのモ.
思い入れの問題を引くDTOのリポジトリ(例えばCustomerDTO)に変換しまのドメインのオブジェクト(お客様)マーサービス。私はそのように保存し、新しいオブジェクトを返例SalesOrder)を含む一人のお客様にオブジェクトです。この順番に変換されSalesOrderDTO(CustomerDTO)を押して、リポジトリ
設定によりどちらのモしないようなことは文句のCustomerDTOが重複す。私はここで抜いて初のCustomerDTO同じセッションでの帰還に変換した後でこのオブジェクトです。
Amにこだわったここにはあるので、周辺か。
感謝
ジェームス
解決
あなたはロックを使用してNHibernateの中のセッションにオブジェクトを再接続することができます - 。例えば
_session.Lock(myDetachedObject, NHibernate.LockMode.None);
や正確ここで何が起こっているかに応じて、助けてもしなくてもよいです。 DTOのNHibernateのでは、最も一般的な方法、NHibernateのは、(主に)永続無知をサポートしているという事実ではありません使用してサイドノート、上で一般的にDTOのは、広くは、いくつかの他のORMフレームワークのように使用されていないことを意味します。
他のヒント
これは、NHibernateのセッションがどのように機能するかについては本当にです。セッション内で、あなたのCustomerDTOのインスタンスを引きそうだとすれば、その後しばらくした後、あなたは(主キーによって、例えば)同じCustomerDTOを取得する必要があります - あなたが最初の検索で行ったように、あなたが実際には非常に同じオブジェクトへの参照を取得します。 P>
それでは、あなたがやっていることは、あなたがsession.Merge呼び出すことでオブジェクトをマージするのどちらかということですか、あなたの更新を行うsession.Get(主キー)を呼び出すことにより、オブジェクトのためのセッションを尋ねると、セッションをフラッシュします。
スティーブによって示唆されているように、しかし - これはあなたが何をすべきか、通常ではありません - あなたが本当にデータストアからあなたのドメインオブジェクトを取得し、UI、Webサービスにデータを転送する(neede場合)のDTOを使用したいものは何でも...
いるその他の重点実施EqualsおよびGetHashCodeには正しい方向を向いている。も設定によりどちらのモの支援のための"添付"または/Mム.
ものではありませんのnosetter.キャメルケースのオプションの処分: http://davybrion.com/blog/2009/03/entities-required-properties-and-properties-that-shouldnt-be-modified/
また、いするよう促すなdissuadedに不足情報があります。ないん夢中となることも間違っています。ですから、端ます。残念ながら最大の消費者に図書館のような設定によりどちらのモッ内および/またはwebアプリが存在する、自由にすべての永続化のニーズに対して単一のデータベースです。実際には多くの例です。
例えば、私の努力が払われてきたが、現在、商業デスクトップアプリのドメインのオブジェクトがそのデータの普及との間にSQL CEデータベースや画像ファイルの速度で処理が行われます。残念ながら設定によりどちらのモで作り出すのに役立つだけでなく、SQL CE続けました。私の使用を強制されるような"ダブルのマッピング"を参照 マルタンファウラーの"パターンの企業はapアーキテクチャ" 図私のドメインモデルリポジトリによる層を積層することを知ってどのようなデータが設定によりどちらのモどのディスク。
いなどが挙げられる。である。ものであることは確かである明らかなツールを示しまし悪いです。ものが実情であるだけでは、エッジの場合では、構築から解放され、よりこれらのパターンを自分でます。
私はこれがそれているためであると仮定しています 最初CustomerDTOで引き抜きます 同じセッションと理由 バック変換されている返すと 前後には、これを認識することはできません 同じオブジェクトます。
あなたは正しいです。 Hibernateはできません。この問題を解決するために等しく、ハッシュコードを実装することを検討してください。私はあなたがこのセッション内のオブジェクトをロードしていない場合は再取り付けが唯一の仕事かもしれないと思う。