【问题标题】:NHibernate custom SQL object creationNHibernate 自定义 SQL 对象创建
【发布时间】:2010-09-18 00:07:36
【问题描述】:

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

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

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

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

有什么方法可以在 NHibernate 框架中做我想做的事情,还是应该只做原始 SQL?如果可能的话,我试图保持数据库的可移植性,这让我回避了原始选项。似乎我错过了一个更好的方法。

【问题讨论】:

    标签: .net sql nhibernate orm


    【解决方案1】:

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

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

    【讨论】:

    • 我添加了一个“手动”层,但我想知道这是否可以在不解决 NHibernate 的情况下完成......所以这绝对有帮助,但它看起来不像“正确”的方式。
    • 嗯,这不一定适用于 NHibernate,它只是两个类,其中一个是基于相同基表的另一个的只读摘要。
    • 啊哈,我现在明白了。我不确定要走哪条路,但感谢您提供的线索……这有点棘手!
    【解决方案2】:

    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,则必须直接进行。另一个不好的部分是我没有时间测试这个,所以我不知道它是否有效。

    【讨论】:

    • 啊哈,我明白你在说什么。如果我尝试将 A 和 B 作为“虚拟对象”进行非级联保存,我不确定 NHibernate 会怎么想,但我会试一试。
    猜你喜欢
    • 2014-09-14
    • 2018-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-28
    • 2015-05-15
    • 2016-12-15
    • 2012-07-03
    相关资源
    最近更新 更多