控制 NHibernate 实体 Eagerloading

Posted

技术标签:

【中文标题】控制 NHibernate 实体 Eagerloading【英文标题】:Controlling NHibernate entity Eagerloading 【发布时间】:2015-02-24 17:11:41 【问题描述】:

我对 NHibernate 比较陌生。我正在开发一个 Web 应用程序,在该应用程序中我需要从 Hibernate 会话中分离实体并将其传递给 UI 以进行更改。我正在使用 NHibernateUtil.Initialize 来急切加载实体。我面临的问题是实体有很多集合,有些集合甚至有子集合,所以当我使用 NHibernateUtil.Initialize 时,它急切地加载所有集合,这反过来又增加了我传递给 UI 层的 JSON 数据。我在服务层中使用 ASP.NET Webapi。有没有办法控制急切加载到我在实体中需要的特定集合。任何帮助将不胜感激

谢谢

【问题讨论】:

我会说,该解决方案不在数据层。不在 NHibernate 内部,也不是通过使用急切加载。解决方案应该在服务层上。实施自定义解析器,将它们注入 JSON 序列化程序设置。这些应该能够驱动您的实体应该加载多深并转换为 JSON。或者 - 使用 DTO。这些应该由一些映射器填充(实际上类似于解析器)。但是不要把这个要求放在 NHiberante 上。它不是 JSON 转换的工具 你尝试了什么?你能发布一些代码吗? 【参考方案1】:

在您的映射中,您可以指定延迟加载集合和引用的默认行为。你是如何创建映射的?您可以通过在单个查询中指定获取策略来覆盖默认值。您使用什么模块进行查询(QueryOver、Linq 等)?我的偏好是始终将默认设置为延迟加载,然后根据需要急切获取。

另外,我的偏好是不将实体直接传递给 UI 层,而是在 Controller 中创建一个 ViewModel。

【讨论】:

感谢您的回答,我在数据层中使用 HQL 来为实体补水。到目前为止,我已经创建了几个 DTO,我将把它们推送到 UI。但我觉得这种方法不会有什么问题,因为我的 DTO 是独立于实体的,我想我必须在更新/删除后将它映射回实体。我不确定我的方法是否正确 是的,没错,您需要将其映射回来。使用 DTO 的最大缺点是最终会产生大量重复代码。

以上是关于控制 NHibernate 实体 Eagerloading的主要内容,如果未能解决你的问题,请参考以下文章

如何在运行时从 nhibernate 映射文件生成实体类

NHibernate - 错误脱水属性值 - 更新实体

Nhibernate - 分页和急切加载实体

如何在 NHibernate 实体之间创建三向关系?

许多实体到一个联结表 NHibernate 建模

NHibernate:查询未映射实体时的意外行为