最初の質問について。エンティティを読むだけの場合は、何もする必要はありません。別のエンティティにフィールドとして割り当てる場合でも、レコードをロックする必要はありません。呼び出す必要がある唯一の理由ISession.Lock
は、エンティティを変更して保存する場合です。
例外があり、それは遅延読み込みです。最初のセッションがアクティブなときにロードされなかった外部の子レコードがエンティティにある場合、後でそれらにアクセスしようとすると例外がスローされます。回避する最も簡単な方法は、最初のセッションで子コレクションに触れることです。
このような状況でもエンティティから問題が発生する場合はLoad
、リポジトリにを追加できます。これをに配線できますISession.Load
。データベースにアクセスLoad
せずに、エンティティの空のプロキシを作成します。このエンティティは、エンティティがロードされるセッションの一部であり、他のエンティティのプロパティに割り当てるために使用できます。このアプローチの利点は、非常にクリーンであり、単体テストで簡単にモックできることです。
2番目の質問について。ISession.Lock
はい、リポジトリに統合するのは臭いです。繰り返しますが、エンティティを変更する必要がない場合は、これについて心配する必要はありません。しかし、そうだとすれば、リポジトリからエンティティを再ロードすることを考えて、そのエンティティで作業する必要があります。最適ではないことはわかっていますが、特に単体テストでは、非常に奇妙なコードを大幅に節約できます。
最後に一つだけ。長期間存続するエンティティ(おそらくアプリケーションの完全なランタイム)について話しているとのことですが。ライフタイムには、おおよそ3つのカテゴリがあります。1。永遠、2。長い、3。短い。私がこれに言及する理由は、「長い」存続期間を持つエンティティの問題は、実際には同じ存続期間を持つセッションに接続されたままになる可能性があるためです。たとえば、5分または10分(ユーザーがフォームにデータを入力している時間)の間、セッションを存続させても問題ありません。これだけでほとんどの人が多くのトラブルを救うでしょう。
もう1つの注意:とを見てNHibernateUtil
くださいNHibernateProxyHelper
。これらのクラスは、エンティティと子コレクションのロードを強制するのに役立ちます。