为什么NHibernate从延迟加载的集合中吞下SQL错误?

时间:2013-05-21 20:05:30

标签: nhibernate exception-handling nhibernate-mapping

我有一个映射组件集合的实体,如下所示:

<class name="TeacherResource" table="TeacherResource">
    <id name="TeacherResourceId">
        <generator class="guid"/>
    </id>

    <!-- irrelevant properties here... -->

    <bag name="HelpfulLinks" order-by="BogusColumnName">
        <key column="TeacherResourceId"/>
        <composite-element class="HelpfulLink">
            <property name="Href"/>
            <property name="Display"/>
         </composite-element>
    </bag>
</class>

起初我没有收到任何关于该集合的数据,然后我意识到我有一个不正确的列名来订购该集合。 NHibernate不会抛出异常,但如果在属性延迟加载后在调试器中查看属性,则会定义InnerException来指示错误。

为什么NHibernate会捕获此错误?我在.NET 4.0 / NH 3.3.1上。

NHibernate error

2 个答案:

答案 0 :(得分:1)

NHibernate永远不会吞下Exception。请不要期望来自NHibernate并且从不怀疑 NHibernate。

如果您愿意,我的建议是:始终开始怀疑我们的(NHibernate消费者)代码。

  

没有人是完美的,即使NHibernate可能有一个错误(并看看   在最新版本的更改日志中,已经有多少错误   固定的)。但是,集合映射是如此标准,因此经常使用   部分原因是它很难将错误保留在那里。

根据问题所包含的信息集,很难说问题出在哪里。一些想法:

1)懒惰加载集合HelpfulLinks(如代码段所示)。可能会发生,它从未在运行时触及过。异常 NHibernate.Exceptions.GenericADOException:无法初始化集合只有在遇到初始化的请求时才会被触发。

2)只是一个猜测,非常不可能,在DataLayer之上的解决方案中可能会有一些常见的处理程序...将异常转换为其他东西(事实上吞下它们)

我没有更多的想法。但是什么时候

  • 我使用parent/child
  • 创建了一个临时方案
  • 我按照您的映射(并将错误的列名设置为order-by,
  • 在我触及Children集合的那一刻,我收到了异常。

换句话说,请尝试更多地观察代码。

答案 1 :(得分:1)

正如已经说过的那样,NHibernate永远不会吞下Exception。很可能该集合是通过数据绑定加载的,在这种情况下,数据绑定吞噬了异常。