【问题标题】:How to disable automatic loading in NHibernate?如何在 NHibernate 中禁用自动加载?
【发布时间】:2009-06-05 21:14:03
【问题描述】:

这个问题可能与这个问题重复:

nhibernate - disable automatic\lazy loading of child records for one to many relationsihps

我想知道是否有任何方法可以告诉 nhibernate 不要加载子集合(最好使用流利的 Nhibernate),除非我使用查询手动执行(保留所有映射!)。

问题在于,即使关闭延迟加载,集合也会自动进行急切加载。我希望不加载任何集合,除非我在查询中指定 fetchmode。

【问题讨论】:

    标签: nhibernate fluent-nhibernate


    【解决方案1】:

    从链接的问题和答案中可以看出,您可以通过使关系单向来实现这一点。因此,我不会直接回答如何,而是要问为什么,希望得到更好的“如何”。

    我绝对明白为什么您不总是希望集合被急切地获取,这就是 NHibernate 具有延迟加载的原因(以及为什么 NHibernate 总是延迟加载集合,除非您预先获取)。 NHibernate 在您实际请求之前不会真正获取该集合。所以我的问题是为什么你希望 NHibernate 在你操作它时不加载集合?当您访问实体上的子集合时,您希望 NHibernate 做什么?

    更新:

    你并没有真正回答我为什么(也许我只是固执)的问题,但是很好,你想要控制。那么,阻止 NH 完成其工作的最简单方法是首先不告诉它这样做(即不要映射它)。也就是说,不要映射关系的“多”(集合)端。您仍然可以将集合保留在您的类中,但只要您没有告诉 NHibernate 通过将其添加到映射文件来填充它,它就永远不会。然后,您可以在某处添加PopulateCollection 方法来运行NH 查询并将结果存储在该集合中。但是,您会失去 NHibernate 为集合提供的所有良好语义,因为它无法跟踪对其的更改;您必须实现自己的 Add 和 Remove 方法。

    所以,基本上是 David Kemp 对另一个问题的回答。

    【讨论】:

    • 原因很简单,我想手动控制加载的内容和不加载的内容。不想让查询进入引擎盖下的数据库。此外,在我调试时延迟加载实体也很烦人。如果我正在对未加载的集合进行操作,我预计会出现空异常。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-03
    • 2022-01-14
    • 2012-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多