nHibernate ISession 機能をラップする NCommon の UnitOfWorkScope を使用しています。私たちの目標は、複雑なプロパティをオンデマンドで熱心にロードするのではなく、構成を介して常に熱心にロードすることです。エンティティを取得する特定のサービスは、呼び出し元のコードによって少しカスタマイズできるという考え方です。親エンティティのみをハイドレートしたい場合もあれば、複雑な子プロパティもハイドレートしたい場合もあります。
これを実現するために、次のことを行っています。
var iSession = unitOfWorkScope.CurrentUnitOfWork<NHUnitOfWork>().GetSession<ParentEntity>();
iSession.CreateCriteria<ParentEntity>().SetFetchMode("Children", FetchMode.Eager);
セッションでセットアップしたら、NCommon の IRepository 機能を使用してエンティティを取得します。
var parent = parentRepository.FirstOrDefault(x => x.Id == 123);
ただし、parent.Children コレクションを確認すると、次のようになります。
NHibernate.Collection.Generic.PersistentGenericBag<ChildEntity>
...これは、Eager-loading が発生しなかったことを示しています。NH マッピングを変更して常に熱心な読み込みを強制すると、子が正しく表示されます。
誰でもこれに光を当てることができますか?FetchMode.Eager が無視されるため、何かが足りないと思います。