nhibernate - 在不触发延迟加载或急切加载的情况下将 NHibernate POCO 复制到 DTO

标签 nhibernate automapper poco dto valueinjecter

我需要从 NHibernate POCO 对象创建 DTO。问题是 POCO 对象包含动态 代理,不应将其复制到 DTO。 我渴望加载所有我需要提前传输的集合和引用,我不希望 NHibernate 开始加载我没有提前加载的引用集合。

关于 SO 的几个类似问题收到的答案是:

  1. 建议 Session.GetSessionImplementation().PersistenceContext.Unproxy();
  2. 建议关闭延迟加载。

在我的情况下,第一个建议是无关紧要的,因为根据我的理解,它会导致急切加载以替换代理。实际上,它甚至不起作用 - 它不会删除我的对象中的代理。 (任何解释为什么?)

第二个建议,关闭延迟加载似乎会导致所有引用和集合都急切加载,基本上是加载整个数据库。我的期望是,如果延迟加载关闭,并且我没有请求集合,它将不会被加载。 (我说 NHibernate 没有提供这样的选项是正确的吗?)

我正在使用具有流畅配置的 NHibernate 3.3.1。

重申我的主要问题,我需要创建清除代理的 DTO,从包含代理的 POCO 复制,并且我不想加载这些代理后面的数据。

任何包含示例代码并使用 ValueInjecter/AutoMapper 自动化流程的有用建议都将非常有帮助。

编辑#1:

按照 Roger Alsing 使用投影的建议,我意识到我真正在寻找的是一个类似于 ValueInjecter 的基于约定的映射。这就是为什么。最初,我的 DTO 将与模型的 POCO 定义相同。这是由于庞大的代码库依赖于在客户端项目上传输的现有 POCO。

使用投影,我必须指定必须复制哪个字段子集,并且该子集在每个上下文中可能不同(因为理想情况下,DTO 会有所不同)。这意味着在应该有第二个选项时,会向服务器端引入大量新代码。

使用 ValueInjecter,我将能够在一次调用中按照惯例填充 DTO,而无需编写具体的预测,也不必在未来维护这些预测。也就是说,如果我能够让 ValueInjecter 忽略代理对象。

鉴于在我的情况下使用投影是一个很好但并不理想的解决方案,有没有办法配置像 ValueInjecter 这样的东西来复制 POCO,而无需复制代理或在复制时触发急切/延迟加载?

最佳答案

我通过使用 Linq 或 O/R 映射器可能具有的任何查询语言选择 DTO 作为投影来解决这个问题。

例如

return from c in customers 
       select new CustomerDTO 
       {
          Name = c.Name , 
          Orders = c.Orders.Select (o => new OrderDTO {...} ) 
       };

这样,您就不需要求助于反射魔法或任何其他花哨的东西。 并且查询一次就可以准确地获取您需要的内容,因此,这通常比获取实体然后将它们转换为 mem 中的 DTO 更有效。 (在某些情况下,如果生成的 SQL 查询由于任何原因包含额外的连接,效率可能会降低..)

关于nhibernate - 在不触发延迟加载或急切加载的情况下将 NHibernate POCO 复制到 DTO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11816732/

相关文章:

没有ID的NHibernate映射

c# - AutoMapper 对象集合不映射

asp.net-mvc - 多语言网站中本地化解析器的自动映射器映射

c# - Entity Framework - 多个数据库连接

c++ - POCO C++ SAX 解析器 : If the xml document encoding is ANSI then next statement is not reading and throwing encoding error exception

NHibernate:实体和同一查询中可能的子类的查询条件

.net - Fluent NHibernate 中 Access.BackingField 的用例是什么?

c# - 相关表中的流利 nhibernate 鉴别器

c# - Automapper 自定义解析器源成员到目标对象列表映射问题

c++ - 静态链接 SSL 与 Poco