2012-02-01 7 views
2

のは、私はこのようになりますクラスがあるとしましょうNHibernateのQueryOverとアクセス=「フィールド」のメンバー

public class Entity{ 
    public virtual int ID{ 
    { 
     get{return id;} 
    } 

    private int id = 0;  
} 

私は、ユーザーのIDが含まれてQueryOverを使用したい場合は、どのように私はそうのようにフィールドをバインドすることを考えると、これを達成します:

<id name="id" column="UserID" access="field" unsaved-value="0"> 
      <generator class="identity" /> 
     </id> 

私のクエリのフィールドにアクセスできる方法はありますか?公有財産と一緒に使用しようとすると、実際にHBMに拘束されていない財産に関する問題に遭遇することになります。

このような状況をHQLが処理できるとすれば、QueryOverでも可能ですか?余談として

: 私はIDはバッキングフィールドなしで公共財産であることや、民間のセッターを持つべきであると主張するだろうが、私は(このパターンは、私たちのドメインでどこにでもある)、このような抜本的な変更を行うのを警戒しています。

+0

私はあなたの問題が何であるかを見ていないよ(私の個人的な好みは、私のクエリインナークラスを作ることです。) IDはパブリックプロパティなので、QueryOverで利用できるようにする必要があります。また、私はIDをプライベートセッターの自動プロパティにすることに何の利益も見ませんが、マッピングは変更されません。私はEntityクラスをそのまま残したいと思うでしょう。 –

+1

問題は、プロパティが存在しても、NHibernateに明示的にバインドされていないことです。これは、SQLを生成するときにQueryOverがプロパティを解決できないことを意味します。 – ddango

答えて

1

QueryOver(およびLINQ)はラムダ式を使用してプロパティ名を参照します。つまり、表示ルールはC#の表示ルールです。 HQLとICriteriaは文字列を使用するため、制限はありません。

IDプロパティのみの場合は、IDプロパティのラムダ式を取得し、ICriterion(QueryOverでクエリに追加できる)を返すメソッドを持つことができます。

また、クエリを適切なクラス(または内部クラス)に配置できる場合は、C#構文を使用してフィールドにアクセスする必要があります。

これはラムダ式を使用するAPIに共通の制限です。ここでは、明らかに同じ制限がありFluentNHibernateチームからいくつかの考えを、です:

http://wiki.fluentnhibernate.org/Fluent_mapping_private_properties

関連する問題