2012-01-22 11 views
0

NHibernateセッションからDataGridViewにプルされたオブジェクトをバインドしようとしていますが、問題が発生しています。DataGridViewへのNHibernateプロキシオブジェクトのバインド

私は、コンボボックス列にバインドされているすべての "ルックアップ"項目を取得してオブジェクトを検索します。なんとか、これは依然としてメインオブジェクト上にプロキシの子オブジェクトをもたらします。私はルックアップ項目のマッピングを熱心なフェッチに変更したこともありますが、何とかプロキシを取得します。私はそれらを介して行くように、それはすでにそれを見て、そのキャッシュにそれを持っているため、セッションは、車のメーカーやモデルをデータベースに照会しません

Dim _makes As IList(Of Make) = session.QueryOver(Of Make).List 
Dim _models As IList(Of Model) = session.QueryOver(Of Model).List 
Dim _cars as IList(of Car) = session.QueryOver(of Car).List 
' A car has a .Make and a .Model that are picked from a DGV ComboBox Column 

:ここ

は、私は、オブジェクトを取得しています方法です。しかし、これが事実なら、それはどうしてもそれはプロキシオブジェクトですか?

私はプロキシを避けるように見えないので、これらのオブジェクトをDataGridViewにバインドする最良の方法は何か疑問です。

私は、この問題について議論している記事をいくつか見てきました。たとえば、NHibernate proxy causing problems with databindingですが、それは数年前です。その後、NHibernateは大きく変化しました。今、この問題に対する新しい、あるいはより良い解決策がありますか?

ありがとうございます。

この投稿からいくつかの洞察を得た後、私は別の質問を投稿しました。私はまた、問題の簡単な解決策を見つけました - ここでそれを見ることができます:Binding a collection of objects to a ComboboxColumn in a DataGridView

答えて

1

NHibernateはあなたが尋ねたことをやっています。 マッピングファイルでは、NHに関連付けを持たないように指示しています。あなたが関連するすべてのクラスを持ってきたとしても、NHはまだその命令を持っています。

あなたはNHibernateの熱心な負荷をあなたの車からの製造元とモデルクラスを使用する場合は、あなたがそれを行うには、2つの方法があります:あなたが唯一の時間からの時間にこれらのオブジェクトが必要な場合

  1. を、あなたのクエリを変更
  2. Carクラスを扱うときに常にこれらのオブジェクトが必要な場合はマッピングを変更してください;

最初は簡単です。あなただけのJoinAliasを行う必要があるとNHは、このようにあなたにオブジェクトをもたらす:

Car carAlias = null; 
Model modelAlias = null; 
Make makeAlias = null; 

var query = Session.QueryOver<Car>(()=> carAlias) 
      .JoinAlias(()=> carAlias.Model,()=> modelAlias) 
      .JoinAlias(()=> carAlias.Make,()=> makeAlias) 
      .Where(()=> carAlias.Id == 101).SingleOrDefault(); 

このクエリは、車と2つの関連するクラス(モデルとしてください)この1時間をもたらすでしょう。

2番目の方が最初の方が簡単ですが、注意して、N + 1個の選択で問題に陥る可能性があります。

モデルに設定し、lazy = "false"を変更して変更するマッピングに移動します。

ここで、Carオブジェクトをフェッチするたびに、モデルとメイクが一緒になります。このソリューションは、マッピングファイルに依存する他のクエリに影響します。

私はあなたに役立つことを願っています!

+0

これは意味がありますが、問題を解決していないようです。私はコードを踏んで、これが実行されるのを見てきました。また、単に.Fetch()をやってみました。クエリが実行されても、たとえキャッシュにまだ残っていても、データベースからすべてのデータを再度要求しても、プロキシオブジェクトが生成されます。他のアイデア? – Origin

+0

ありがとうございます。私はNHibernateの部分を誤解していただけでなく、私が読んだいくつかのブログ記事を完全に理解していなかった。私が抱えている問題は、データバインディングの中心にあるようです。私はその赤ちゃんを扱うと、私はそれのNHibernate側をもう一度見てみましょう。 – Origin

+0

ちょうど私の2セントです:) GUIコンポーネント(データグリッド、ドロップダウンなど)でNHibernateマップエンティティを直接使用することはお勧めしません。 N + 1(またはもう一度)を選択したり、さらに悪いシナリオを選択するなどの問題が発生する可能性があります。実行時にISessionオブジェクトが閉じられた場合、例外が発生することがあります。 – cidico

関連する問題