2012-03-23 20 views
2

私はFluent NHibernateを学びます(そして、一般的にNHibernateを拡張しています)。私はいくつかのオーバーライドで自動マッピングを使用していますが、私はそれが重要であるとは思わない(もちろん、私がここで間違っているなら私は喜んで質問を更新するでしょう)。NHibernateがプロキシオブジェクトを返さない場合がありますか?

考えるISession私は自分のIDでエンティティを返すことができます(といくつかのより多くの変数を仮定):

using (var session = SessionFactory.OpenSession()) 
{ 
    var user = session.Get<User>(userId); 
} 

私の限られた理解では、NHibernateのは、Userマッピングされたエンティティの周りのプロキシを作成していること、まだ私はそれをテストするときでした(based on this):私のインスタンスは、プロキシではないかのよう

Assert.That(user is INHibernateProxy, "Not a proxy."); 

それが表示されます。

プロキシを使用しない場合がありますか?私は「欠けている部分」を望んでおり、これが金曜日の午後の脳の失敗ではないと祈っています。

答えて

3

一般に、プロキシは遅延ロード用です。 Getなどでエンタイトルメントを取得する場合は、プロキシは取得できませんが、実際のオブジェクトは取得されます。 NHibernateは、必要でないときにプロキシを使用しません。

userAddressがある場合、user.Address is INHibernateProxyがtrueになります(この関係で遅延ロードがオフになっている場合を除きます)。

NHibernateがどのようにプロキシを処理するかの詳細については、this articleを参照してください。

+0

ああ、欠けている部分は、ここではルートオブジェクトで、非レイジーオブジェクトは物理オブジェクトです。また、プロキシは遅延ロードをサポートするためにのみ使用されますか? –

+0

はい、私はプロキシが遅延読み込み専用であると思います。 – NOtherDev

+0

その記事は役に立ちます。明らかにしてくれてありがとう、私は今からタイプが常にプロキシであるとは思わないでしょう。 –

3

ISession.Get常にnullまたは実際のオブジェクトのいずれかを返します。 ISession.Load OTOH プロキシを返す(または例外を投げる)が、プロキシ処理は全く別の話です。永続クラスは、いくつかの前提条件(仮想プロパティ、非シールなど)を満たす必要があります。

+0

私は、間違いだと思う私の理解は、プロキシは常に周りにあったということでした。遅延読み込みを無効にすると、プロキシを完全に避けることはできますか? –

0

NOtherDevが述べたように、プロキシは遅延ロードのためのものです。しかしSession.Getでもプロキシを返すことがあります。これは私を数回警戒していた。あなたはこのようなlazy="true"を指定することで、テーブル内の任意の列のための遅延ロードを使用する場合:

<property name="Description" type="StringClob" not-null="false" lazy="true"/> 

Session.Getは常にこのタイプのプロキシを返し、オブジェクトをunproxyする方法はありません。実際、プロキシは実際のオブジェクトです。

ところで、遅延読み込みを無効にすることは、本当に悪い考えです。ここでその詳細を読むことができます:NHibernate is lazy, just live with it

関連する問題