1

projectと多対多の関係を持つユーザー オブジェクトがあります。私のユーザーマッピングでは、これがあります:

HasManyToMany(x => x.Projects).Table("UsersProjects").ParentKeyColumn("UserID").Access.None();

簡単な ID クエリによる取得を実行すると、次のようになります。

session.QueryOver<User>()
       .Where(x => x.PrimaryID == id)
       .Take(1).SingleOrDefault();

2 つのクエリが実行されます。1 つ目は ID による取得を行うクエリで、2 つ目はプロジェクトのリストを取得するクエリです。

noop プロパティのポイントは、NHibernate が関係を認識できるようにするためだと思いましたが、実際にはプロパティを設定しません...? 興味深いことに、クエリの後で Projects プロパティが null になるため、プロパティは設定されません (2 番目のクエリはさらに冗長になります!)。

私はNHibernate v3.1.0.4000とFluentNHibernate v1.2.0.712を使用しています

編集

少しテストを行った結果、これは流暢なクエリ インターフェイスの使用に固有の問題ではないことがわかりました。さらに、hbm ファイルへのマッピングをダンプすると、このプロパティのマッピングは次のようになります。

<set access="none" name="Projects" table="UsersProjects">
  <key>
    <column name="UserID" />
  </key>
  <many-to-many class="Project">
    <column name="ProjectID" />
  </many-to-many>
</set>

これは私が期待するもののように見えます ( http://ayende.com/blog/4054/nhibernate-query-only-properties )。

4

2 に答える 2

1

プロパティは、Access=nonePOCO 内のコレクションのアクセス レベルを参照します。あなたのクエリではありません。(アクセスは「プロパティ」、「フィールド」、「パブリック フィールド」などにすることができます)。したがって、コレクションの処理方法には関係ありません。herehere を使用すると、コレクションを
参照するまでコレクションが読み込まれなくなります (これは、私が理解しているように、あなたが望むものです)。
lazy=true

于 2011-08-26T11:45:57.760 に答える
0

これはハックだと思いますが、マッピングにLazyLoad()を追加すると、2番目の不要なクエリが実行されなくなります。

HasManyToMany(x => x.Projects).Table("UsersProjects").ParentKeyColumn("UserID").LazyLoad().Access.None();
于 2011-08-26T02:21:05.437 に答える