首页 > 解决方案 > 如何阻止 NHibernate 读取子集合?

问题描述

我的数据库中有文档列表。每个文档都有一组子元素。现在,我的情况是: - 读取文档(仅从文档表中) - 关闭会话并让用户做一些工作。

但是当我这样做时,Document 会尝试在某些地方加载子元素。我不想要它。我只想明确地阅读子元素。对于第一部分,我只需要阅读简单的文档值。

那么有什么方法可以对 nHibernate 说 - “嘿,永远不要阅读这个集合!”?

标签: c#nhibernate

解决方案


将您的收藏集的延迟加载设置为LazyExtra,也许您的设置为NoLazy(又名急切加载)。

最好将其设置为Extra而不是Lazy仅。因为当您只想获取子集合的.Count()or时,它会阻止 NHibernate 获取子集合的行.Any()Extra就像一个更懒惰的懒惰版本:)

使用NoLazy /急切加载

var post = session.Get<Post>(1);

即使您没有从应用程序访问帖子的子集合评论,这也会从数据库中的帖子表中读取一行并从评论表中读取一行。

使用Lazy,var post = session.Get<Post>(1)只会从 posts 表中加载一行,NHibernate 不会从数据库中读取帖子的子集合评论。

至于 Lazy vs Extra

使用懒惰

var commentsCount = post.Comments.Count()

这将从数据库中加载帖子的评论:

select * from comments where post_id = 1;

,.Count()仅发生在应用程序端。

使用Extra , var commentsCount = post.Comments.Count(), NHibernate 将只发出计数查询,而不是读取所有行。

select count(*) from comments where post_id = 1

如果您使用 NHibernate 的自动映射,这是一个设置子集合加载机制的示例配置,您可以在BeforeMapSet事件中设置该设置:

在此处输入图像描述

当您需要预先加载配置为Lazyor的子集合Extra时,请使用FetchMany


推荐阅读