JobとGroupの2 つの関連エンティティがあり、多対多の関係があります。
特定のジョブとそれに関連付けられているグループを取得するための簡単なクエリを実行しています ( GroupRecipientsプロパティを介して):
var job = jobsRepo.Get()
.Where(j => j.Id == jobKey.Id)
.FirstOrDefault();
var countA = job.GroupRecipients.Count;
その結果はcountA==2で、データベースの状態に対応します。
最初の奇妙な点は、FetchMany を追加したときに発生します。
var job = jobsRepo.Get()
.FetchMany(x => x.GroupRecipients)
.Where(j => j.Id == jobKey.Id)
.FirstOrDefault();
var countB = job.GroupRecipients.Count;
この結果はcountB==1になります。job.GroupRecipients コレクションには 1 つのアイテムしか表示されません。これは、データベース内の状態と矛盾しています。
しかし、それはさらに興味深いものになります。以下を連続して実行すると:
var job = jobsRepo.Get()
.Where(j => j.Id == jobKey.Id)
.FirstOrDefault();
var countA = job.GroupRecipients.Count;
var jobB = jobsRepo.Get()
.FetchMany(x => x.GroupRecipients)
.Where(j => j.Id == jobKey.Id)
.FirstOrDefault();
var countB = jobB.GroupRecipients.Count;
次に、期待される結果であるcountB==2を取得します。countA を含む行を再度削除すると、countB==1が発生します。
詳細情報:ステートレス セッションのトランザクションでクエリを実行します。NHibernate のバージョンは3.3.1です
したがって、この 2 つの問題は次のように要約できます。
- FetchMany は部分的な結果を返します
- あるクエリが予期しない方法で別のクエリに依存しています。
この動作の説明は大歓迎です。