2

次のシナリオを検討してください。

クラス A は、クラス B に対して 1 対多の関係を持ちます。クラス B は、クラス C に対して多対 1 の関係を持ちます。

class A {
  IList<B> BList {get;set;}
}
class B {
  C CMember{get;set;}
}

class C {
   //null
}

次のようなものを使用してデータベースからクラスBをロードすると

   IList<B> result = query.List<B>();

すべてが期待どおりに機能し、

ただし、次のようなことをすると:

   DetachedCriteria query = DetachedCriteria.For(typeof(A));
   query.CreateAlias("B", "B", JoinType.InnerJoin);
   IList<A> result = query.List<A>();

次に、NHibernate もテーブル C から選択し、すべての C をロードします。

以下のマッピング: マッピング...

<bag name="BList " table="B" lazy="true" inverse="false">
    <key column="id" />
    <one-to-many class="B" />
    </bag>

B マッピング...

<many-to-one class="C" name="CMember" column="idC" lazy="proxy" outer-join="true" />

何か案は?ありがとう。

4

1 に答える 1

1

概説したシナリオをテストするためのサンプルアプリを作成しましたが、CriteriaとDetachedCriteriaの違いを再現できませんでした。どちらも、同じ結果を返しました。

ロードがlazyプロパティに従うかどうかは、outer-join属性に依存していました。設定すると、常にCが熱心にロードされ、outer-join属性を削除すると、プロキシを介してレイジーロードされました。

したがって、考えられる解決策の1つは、Bマッピングを次のように変更することです。

<many-to-one class="C" name="CMember" column="idC" lazy="proxy"/>
于 2011-06-15T06:53:09.007 に答える