我们正在使用 NCommon 的 UnitOfWorkScope,它包装了 nHibernate ISession 功能。我们的目标是按需预先加载复杂的属性,而不是总是通过配置预先加载它们。这个想法是,检索实体的给定服务可以通过调用代码进行一些自定义 - 有时我们只希望父实体被水合,其他时候我们可能也希望复杂的子属性也被水合。
为此,我们正在执行以下操作:
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>
...这告诉我没有发生急切加载。当我们修改 NH 映射以始终强制进行急切加载时,我们可以正确地看到子代。
任何人都可以阐明这一点吗?我假设我们错过了一些东西,因为 FetchMode.Eager 被忽略了。