スケジュールのコレクションを含むエンティティリマインダーがあります(ここのマッピングを参照してください)。コレクションのスケジュールを遅延ロードしたくなかったので、属性をfalseに設定しました。
<set access="field.pascalcase-underscore" cascade="all-delete-orphan" inverse="true" lazy="false" name="Schedules" mutable="true">
<key foreign-key="FK_Schedules_Reminders">
<column name="ReminderCode" />
</key>
<one-to-many class="ReminderSchedule" />
</set>
あるクエリでは、コレクションをロードしたくなかったので、SetFetchModeをLazyに設定しました。
ICriteria FiltersCriteria = session.CreateCriteria<Domain.Reminder>();
FiltersCriteria.SetFetchMode("Schedules", FetchMode.Lazy);
クエリを実行すると、Nhibernateがリマインダーのクエリを実行していて、リマインダーごとに、スケジュールを取得するための単一のクエリを実行していることに気付きました。
これが私が使っていたコードです:
ICriteria FiltersCriteria = session.CreateCriteria<Domain.Reminder>();
FiltersCriteria.SetFetchMode("Schedules", FetchMode.Lazy)
Result = FiltersCriteria.List<Domain.Reminder>();
少し苦労した後、Futureを使用してコードを変更し、すべてが正常に機能しました。
ICriteria FiltersCriteria = session.CreateCriteria<Domain.Reminder>();
FiltersCriteria.SetFetchMode("Schedules", FetchMode.Lazy)
Result = FiltersCriteria
.Future<Domain.Reminder>()
.ToList<Domain.Reminder>();
FetchMode.Lazyを使用するだけでは機能しないのはなぜですか?なぜFutureを使用する必要があるのですか?スキーマでレイジーモードを設定すると、明らかに、すべてが期待どおりに機能します。
ありがとう。