.net NHibernate自定义SQL对象创建

.net NHibernate自定义SQL对象创建,.net,sql,nhibernate,orm,.net,Sql,Nhibernate,Orm,有些简化的示例情况:我有实体A和B,它们是难以置信的“重”域对象。从数据库中加载一个是一件非常重要的事情。然后我有一个实体C,这是一个非常简单的对象,它有一个标签字符串,一个a,一个B——都是惰性的 我正在做一些低级查询来创建巨大的C列表,因此我确切地知道我需要为C.A和C.B保存哪些ID,但我不想加载整个对象并将它们设置为属性,因为开销太大了 相反,我只想将ID直接插入到我的C实体中,然后让它上的A和B属性在以后只有在需要时才被完全加载 我在文档中看到了标记,但这一部分内容非常少 有没有办法在

有些简化的示例情况:我有实体A和B,它们是难以置信的“重”域对象。从数据库中加载一个是一件非常重要的事情。然后我有一个实体C,这是一个非常简单的对象,它有一个标签字符串,一个a,一个B——都是惰性的

我正在做一些低级查询来创建巨大的C列表,因此我确切地知道我需要为C.A和C.B保存哪些ID,但我不想加载整个对象并将它们设置为属性,因为开销太大了

相反,我只想将ID直接插入到我的C实体中,然后让它上的A和B属性在以后只有在需要时才被完全加载

我在文档中看到了
标记,但这一部分内容非常少


有没有办法在NHibernate框架内完成我想做的事情,或者我应该只执行原始SQL?如果可能的话,我正在努力保持数据库的可移植性,这使我回避原始选项。我不知道NHibernate是否允许这样做(在相同的基础数据上分离对象),但通常我制作“摘要”对象,可以将其上转换为完整对象(即使在完整对象上延迟加载)。我通常使用代码生成或手动ORM层来实现这一点

大型集合通常是摘要的集合,如果摘要未公开所需的属性或方法,则会将它们上转换为完整的对象以供调用或传递,等等。

Dan--不确定这是否可以在不进行测试的情况下工作,但值得一试。我猜您已经有了要添加到C中的ID——所以将您的关联(我假设是多对一)设置为insert=“false”和update=“false”(可能cascade=“none”也可以使用)。然后创建A和B实体的“空副本”,将ID添加到它们,将它们添加到C并尝试保存C(Session.SaveOrUpdateCopy(C))。希望NHibernate不会尝试将新的a和B对象添加到各自的表中,而只是在C表中设置正确的ID——这样您就不必加载a和B实体


糟糕的是,如果你必须保存或更新A和B,你必须直接保存或更新。另一个不好的地方是我没有时间来测试这个,所以我不知道它是否会工作。

我添加了一个“手动”层,但我想知道这是否可以在不使用NHibernate的情况下完成。。。所以这肯定是有帮助的,但它似乎不是“正确”的方式。好吧,这不一定是围绕NHibernate工作的,它只是两个类,其中一个是另一个的只读摘要,基于相同的基表。啊哈,我现在明白了。我不知道该走哪条路,但谢谢你提供的线索。。。这一切都有点狡猾!啊哈,我明白你的意思了。如果我尝试使用a和B作为“虚拟对象”进行非级联保存,我不确定NHibernate会怎么想,但我会试一试。