NHibernate自定义SQL对象创建

时间:2008-10-19 14:33:22

标签: .net sql nhibernate orm

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

我正在做一些低级查询来创建巨大的C列表,所以我确切地知道我需要为CA和CB保存哪些ID,但我想要加载整个对象并将它们设置为属性,因为开销是疯狂的。

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

我在文档中看到了<sql-insert/>标记,但该部分确实稀疏。

有没有办法在NHibernate框架内做我想做的事情,或者我应该只做原始SQL?我想尽可能保持数据库的可移植性,这让我回避原始选项。似乎必须有一种我错过的更好的方式。

2 个答案:

答案 0 :(得分:1)

我不知道NHibernate是否允许这个(相同基础数据上的单独对象),但通常我会制作“摘要”对象,这些对象可以上转换为完整对象(即使在完整对象上延迟加载) 。我通常使用代码生成或手动ORM层来完成此操作。

大型集合通常是摘要,然后如果摘要不公开所需的属性或方法,它们会被上转换为调用的完整对象,或者被传递等等。

答案 1 :(得分:1)

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

不好的部分是,如果你必须保存或更新A和B,你必须直接进行。另一个不好的部分是我没时间测试这个,所以我不知道它是否会起作用。