NHibernate:如何获取没有子集合的对象?

Posted

技术标签:

【中文标题】NHibernate:如何获取没有子集合的对象?【英文标题】:NHibernate: How to fetch an object without its child collections? 【发布时间】:2011-01-04 14:50:29 【问题描述】:

我的 Object1 类型的对象包含 List Children1 属性。 我很想在没有孩子的情况下得到这些物品。

似乎 detachedCriteria.SetFetchMode ("Children1", FetchMode.Lazy) 应该是这样的, 但显然不是:( 我尝试使用 (new SessionScope()) 获取数据并将 null 设置为 .Children1 但它没有成功(数据已被提取)。

任何想法都将不胜感激。

【问题讨论】:

我在提出问题几天后“解决”了这个问题,但忘记在这里写了。在 HasMany 映射中设置 Lazy=true 后:1)当我想要急切的行为时,我设置了 criteria.SetFetchMode ("Children1", FetchMode.Eager) 2) 当我想要懒惰的行为时,我设置了 criteria.SetFetchMode ("Children1", FetchMode.懒惰),然后我 FindAll(标准)我的对象,我将 null 设置为 Children1 List 属性。我不确定所有这些技巧都是必要的,但我不在乎了。 【参考方案1】:

当您映射集合时,您是否指定不使用延迟加载?此时尝试指定延迟加载。

【讨论】:

我没有指定任何东西,所以默认值适用,但是我不知道什么是默认值。顺便说一句,问题已“解决”。我会在几分钟后添加评论。【参考方案2】:

我们在当前的解决方案中遇到了同样的问题,并且在映射中设置 Lazy 不起作用。我们不得不将 default-lazy 设置为 true,然后它突然起作用了。

如果默认情况下所有关系都应该是惰性的,这将最有效。

【讨论】:

好的,我已经在 HasMany 属性上设置了 Lazy=true,现在它可以工作了,但是在其他(更频繁的)用例中,我需要预先加载...我更喜欢预先加载默认情况下并且按需延迟,但是如果这太复杂了...我将尝试修复那些其他用例(现在我得到 LazyInitializationException ...未能延迟初始化角色集合...没有会话或会话已关闭) 您收到该异常是因为您的会话已关闭,如消息所述。您需要将会话注入您的存储库/数据访问类并从外部控制会话生命周期。您希望会话持续整个请求生命周期,特别是如果您有延迟加载。我们在我们的 mvc 控制器上使用 UnitOfWork 属性来启动和关闭会话,如果抛出任何休眠异常,它就会被咳嗽并回滚【参考方案3】:

当使用 ICriteria API 检索您的实体时,您可以指定(覆盖)必须用于关联的 fetchmode:

ICriteria crit = session.CreateCriteria (typeof(MyEntity));
crit.SetFetchMode ("someAssociationPath", FetchMode.Lazy);

【讨论】:

我试过了。你真的读过我的问题吗? ;) 顺便说一句,问题已“解决”。我会在几分钟后添加评论。【参考方案4】:

在我看来,您使用的是一对一映射。在这种情况下,延迟加载将无法正常工作。如果是这样,请检查this article。否则请提供更多代码和映射。

【讨论】:

为什么在您看来它是一对一的映射?当 Object1 有 List 我认为很明显它至少是一对多的。顺便说一句,问题已“解决”。我会在几分钟后添加评论。 @wysek,你没有提供任何代码,所以我只是从我的角度假设最有可能的原因。抱歉,我不擅长阅读。

以上是关于NHibernate:如何获取没有子集合的对象?的主要内容,如果未能解决你的问题,请参考以下文章

使用 nHibernate 选择具有许多子集合的实体的性能不佳

WPF TreeView HierarchicalDataTemplate - 绑定到具有多个子集合的对象

java中,如何查询一个list并得到list里面子集合的一条数据。

如何用JS获取后台MAP中集合的值

子集合的 Firestore 监听器

在 Firestore 中删除包含所有子集合和嵌套子集合的文档