c# - 如何阻止 NHibernate 读取子集合?
问题描述
我的数据库中有文档列表。每个文档都有一组子元素。现在,我的情况是: - 读取文档(仅从文档表中) - 关闭会话并让用户做一些工作。
但是当我这样做时,Document 会尝试在某些地方加载子元素。我不想要它。我只想明确地阅读子元素。对于第一部分,我只需要阅读简单的文档值。
那么有什么方法可以对 nHibernate 说 - “嘿,永远不要阅读这个集合!”?
解决方案
将您的收藏集的延迟加载设置为Lazy
或Extra
,也许您的设置为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事件中设置该设置:
当您需要预先加载配置为Lazy
or的子集合Extra
时,请使用FetchMany
推荐阅读
- javascript - React 功能组件中的 RxJS
- c# - 为什么 xUnit 测试会抛出 AggregateException?
- javascript - Qualtrics 和 Javascript - 将单词随机插入句子
- html - 解析csv文件,如何确定日期列格式?
- mysql - 有没有办法将 JSON 字段中的数组与 MySQL 中的 JSON_ARRAY 进行比较?
- java - 使用 Apache Camel 从另一个 API 使用 JSON 并将其写入 CSV
- sql - 如何使用 postgres 获取日期
- bokeh - 散景:使用矩形字形、宽度和 x 共享
- python - Berkeley PacMan 项目中的 Tkinter 问题 - tkinter.TclError: no display name and no $DISPLAY environment variable
- c++ - 任务是找到一个总和最大的子序列,这样子序列中的数组中不应该有相邻的元素