これはかなり一般的な問題のようです。遅延ロードされたコレクションを持つNHibernateオブジェクトをロードします。後で、コレクションにアクセスして何かをします。私はまだnhibernateセッションを開いているので(ビューごとに管理されているなど)、実際には機能しますが、トランザクションは閉じられているため、NHprofでは「暗黙のトランザクションの使用は推奨されていません」。
このメッセージを理解し、作業単位の実装を使用しているので、新しいトランザクションを作成し、その中に遅延ロードされたコレクションへの呼び出しをラップするだけで修正できます。
私の問題は、これが正しく感じられないことです...私はこの素晴らしいNHibernateフレームワークを持っており、遅延読み込みができますが、トランザクション内のすべてのプロパティアクセスをラップせずに使用することはできません。
私はこれをたくさんググって、たくさんのブログ投稿、SOに関する質問などを読みましたが、完全な解決策を見つけることができないようです。
これは私が考えたものです:
- 遅延読み込みをオフにします。これはばかげていると思います。スポーツカーでいっぱいになって、エコモードでしか運転しないようなものです。すべてを積極的に読み込むとパフォーマンスが低下します。参照ではなくIDを使用している場合、なぜNhibernateを気にする必要がありますか?
- トランザクションをより長く開いたままにします。トランザクションは長続きするべきではなく、ビューが開いている限りトランザクションを開いたままにしておくと、問題が発生するだけです。
- トランザクション内のすべての遅延ロードプロパティアクセスをラップします。動作しますが、肥大化してエラーが発生しやすくなります。(つまり、アクセサーをラップするのを忘れた場合でも、正常に機能します。NHProfを使用するだけで問題がわかります)
- 最初のオブジェクトをロードするときに、必要になる可能性のあるプロパティのすべてのデータを常にロードします。繰り返しになりますが、これはエラーが発生しやすく、不要なデータをロードする場合(後でアクセスするための呼び出しが削除されたため)、またはデータをロードしない場合の両方で発生します。
それで、より良い方法はありますか?どんな助け/考えもありがたいです。