NHibernate POCOオブジェクトからDTOを作成する必要があります。問題は、POCO オブジェクトに動的プロキシが含まれているため、DTO にコピーしてはならないことです。事前に転送する必要があるすべてのコレクションと参照を熱心にロードします。事前にロードしなかった参照コレクションのロードを NHibernate に開始させたくありません。
SOに関するいくつかの同様の質問には、次のいずれかの回答が寄せられました。
- Session.GetSessionImplementation().PersistenceContext.Unproxy(); を提案する
- 遅延読み込みをオフにすることを提案します。
私の理解によれば、プロキシを置き換えるために熱心な読み込みが発生するため、最初の提案は無関係です。実際には、それは機能しません。オブジェクト内のプロキシは削除されません。(理由は?)
2番目の提案は、遅延読み込みをオフにすると、すべての参照とコレクションが熱心に読み込まれ、基本的にDB全体が読み込まれるようです。遅延読み込みがオフで、コレクションをリクエストしていない場合、コレクションは読み込まれないと予想していました。(NHibernate がそのようなオプションを提供していないというのは正しいですか?)
流暢な構成で NHibernate 3.3.1 を使用しています。
主な質問を繰り返しますが、プロキシを含む POCO からコピーされた、プロキシのない DTO を作成する必要があります。これらのプロキシの背後にデータをロードしたくありません。
コード例を含み、ValueInjecter / AutoMapper を使用してプロセスを自動化する有益な提案は、非常に役立ちます。
編集#1:
プロジェクションを使用するという Roger Alsing の提案に従って、私が実際に探しているのは ValueInjecter のような規則ベースのマッピングであることに気付きました。これが理由です。最初に、私の DTO はモデルの POCO と同じように定義されます。これは、クライアント側プロジェクトで転送される既存の POCO に依存する大規模なコード ベースが原因です。
プロジェクションを使用して、フィールドのどのサブセットをコピーする必要があるかを指定する必要があります。このサブセットは、コンテキストごとに異なる可能性があります (理想的には、DTO が異なるため)。これは、2 番目のオプションが必要な場合に、サーバー側に導入される多くの新しいコードを意味します。
ValueInjecter を使用すると、特定のプロジェクションを記述したり、将来にわたってそれらを維持したりすることなく、1 回の呼び出しで規則に従って DTO を設定できます。つまり、ValueInjecter に Proxy オブジェクトを無視させることができればということです。
私の状況ではプロジェクションを使用することは良いが理想的な解決策ではないことを考えると、ValueInjecter のようなものを構成して、プロキシをコピーしたり、コピー時に熱心/遅延ロードをトリガーしたりせずに POCO をコピーする方法はありますか?