たぶん私はすでにこれを「理想的な」方法でやっていますが、どういうわけかそれは私には正しく感じられません。
結果を見つけた後、さまざまなコントロール(3つは互いにバインドされたデータグリッド)の情報を即座に表示する検索フォームがあります。
現在、UoW管理を次のように設定しています。
- ユーザーが検索を開始するたびに、古いUoWがあったかどうかを確認し、それを破棄します(そしてそれはセッションです)
- 新しいUoWを作成する
- トランザクションを開始します
- 検索を実行する
- トランザクションをコミットする
コード例:
if(_unitOfWork != null)
{
_unitOfWork.Dispose();
}
_unitOfWork = new UnitOfWork();
_unitOfWork.Begin();
ICollection<Case> cases = casesQuery.ToList();
_unitOfWork.Commit();
iDeallyこの時点ですべてのオブジェクトをデータバインドし、データバインディングが完了した後、UoWを破棄したいと思います。
残念ながら、3つのデータグリッドのうち2つをデータバインドするために遅延読み込みが行われているため、これを行うことはできません。これらのエンティティの一部は異なるプロパティと参照を持つサブクラスであるため、これらのエンティティにコレクションとオブジェクトグラフを明示的にロードすることは実際にはオプションではありません。それらを明示的にロードするのは大変な作業のようです。
私が知りたいのは、これをより良くする方法があるかどうかです、私は次のことを考慮しました:
- コンバーターを使用して、データにバインドされた値を取得し、それがプロキシであるかどうかを確認し、プロキシである場合はこのプロキシをロードします。これは、コンバーターをすべてのデータバインドされたプロパティに設定する必要があることを意味しますが、これも非効率的です。
- 明示的にロードする、これを行わない理由は上記のとおりです
- 私の現在の解決策は、UoWを「検索」にまたがらせることです。これに関する最大の問題は、遅延読み込みが行われている間はトランザクションを開いたままにできないことです。(私はできましたが、ユーザーがそのトランザクションを無期限に開いたままにしておくことができるという事実のために、それは非常に悪いことのように思えます)
誰かがこの状況を処理するためのより良い方法を持っていますか、それとも私が現在していることは可能な限り最高のことですか?