1

私が働いている場所で問題が発生しています。MVC3 ビュー内から NHibernate エンティティの遅延ロードされたプロパティにアクセスしようとすると、"No Session" LazyInitializationException がスローされます。これは先週から発生し始めたばかりですが、問題を絞り込むことはできませんでした. しかし、単純な解決策があるようには見えません。

:

  • スタックトレースの例: http://textsnip.com/613608
  • プロジェクトのどこにも Dispose (または using で Session をラップ) しません。ObjectFactory にそれを処理させます。
  • これは、回帰テスト (WatiN を使用した SpecFlow) を実行しているときに、TeamCity テスト環境でのみ発生します。開発マシンで問題を再現できる人は誰もいません。
  • これも一貫して発生しません。通常、失敗するテストは同じテストですが、常に失敗するわけではありません。同じビューのいくつかにヒットするページにアクセスする他のテストは失敗しません。
  • 失敗するテストでは、非コレクションよりも遅延ロードされたコレクションの初期化に重きを置いているように見えますが、両方とも発生します。
  • 可能であればいつでもエンティティを熱心にロードするほうがよいことはわかっていますが、多くのテーブル モデルの相互依存性のために、現時点ではそれほど実現可能ではありません。

ここで何が欠けていますか?

4

2 に答える 2

1

エンティティの読み込みパターンは、オープン セッション イン ビューと呼ばれ、アンチパターンと見なされます。このパターンの短所の詳細については、こちらこちらをご覧ください。

推奨されるアプローチは、プリフェッチされたデータでいくつかのビュー モデルを使用することです。しかし、それができない場合は、linq を使用してモデル データをプリフェッチし、expand 拡張機能を休止状態にすることができます。型付き展開拡張機能を提供するオープンソース ライブラリITDT.Sentiaがあります。または、Google で「nhibernate expand」を検索できます。より低レベルのことについては、nhibernate fetching strategy参照してください。

たとえば、ITDT.Sentia ライブラリを使用し、次のモデルを使用します。

public class User : BaseEntity
{
    public virtual string Email { get; set; }
    public virtual Company Company { get; set; }
}

public class Company : BaseEntity
{
    public virtual string Name { get; set; }
}

また、ユーザーを取得した後に Company エンティティを遅延読み込みすると仮定すると、次のようなことができます。

IList<User> users = userRepository
  .GetAll()
  .Where(u => /*some constraints*/)
 // here you are telling nhibernate to make a join and eger load what you need
  .Expand(u  => u.Company) 
  .ToList();

開発環境でのさまざまな動作については、何らかの形で他の構成ファイルを使用していると推測できますが、おそらく異なるデバッグ/リリース web.config がありますか?

于 2012-04-18T18:45:55.540 に答える
0

ビューでオブジェクト モデルに直接バインドしていますか? それは、ドメイン オブジェクトに直接バインドを表示するという点で問題のように思えます。ドメイン オブジェクトには遅延コレクションがあるため、Nhibernate セッションを必要とするコレクション要素をオンデマンドでロードしようとしています。

コントローラーメソッドで完全なビューモデルを構築する必要があります。

私の提案は、あなたが持っている各ビューのビューモデルを作成することです. 次に、NHibernate にクエリを実行するときに、モデルに直接投影するか、Automapper を使用してオブジェクト モデルをビュー モデルに変換します。直接射影の良い点は、必要な列のみを選択するため、nhibernate を介したクエリがより効率的になることです。

こちらの記事もご覧ください。 http://lostechies.com/jimmybogard/2009/06/30/how-we-do-mvc-view-models/

これは、ビュー モデルの一連のベスト プラクティスを作成するものです。

于 2012-04-18T16:14:42.437 に答える