当NHibernate找不到实体时,有没有办法跟踪试图加载它的内容?

时间:2011-08-26 17:48:33

标签: nhibernate

我有一个胖客户端应用程序,它有很多相当复杂的对象相互关系。偶尔我有一个实例,其中A引用实体X,它被删除。数据库保存得很好,但重新加载后我得到了可怕的NHibernate.UnresolvableObjectException : No row with the given identifier exists[X#1]

我接受这是我软件中的一个错误,也是我必须解决的问题。同时,现实开始,我需要修复数据库 - 但是我如何修复它真的取决于引用它的内容。我找不到任何简单的方法。

它可以是实体A,也可以是实体B-Z。我也不知道引用实体上的哪些属性可以加载它,或者它是集合的一部分还是什么。

我知道您可以设置Configuration.EntityNotFoundDelegate并指定References(x => x.B).NotFound.Ignore()(或NHibernate中的等效项)。但这并没有让我更接近于找出引用它的内容。我通常会通过我的数据库进行有时费力的搜索。

也许使用其他模式会更容易,因为您可以查看外键约束并稍微减少搜索空间。但是我使用的是SQLite,NHibernate不会在SQLite模式中创建外键约束。

理想情况下,我正在考虑记录此类信息。然而,即使我通过调试器运行它,也很少获得信息,因为NHibernate代码中引发了异常。 但是,即使在运行试图通过调试器

运行时也是如此

1 个答案:

答案 0 :(得分:3)

尝试使用内置的SQL日志记录/调试日志记录。它应该向你展示NHibernate试图做的一切。

对于不知道如何操作的人,您需要在.config文件中定义log4net配置部分

    <configSections>
        <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
    </configSections>

然后,添加实际的log4net配置部分。设置一个appender和一个记录器。在这个例子中,NHibernate的SQL将附加到C:\ projects \ logs \ NHibernate.log。在我的例子中,这是一个Windows服务,它可以访问该目录。您需要确保应用程序可以访问您设置的路径。配置会话工厂时,还需要将“ShowSQL”设置为true。

Log4Net配置部分:

    <log4net>

        <appender name="NHibernateAppender" type="log4net.Appender.RollingFileAppender">
            <file value="C:\Projects\logs\NHibernate.log" />
            <appendToFile value="true" />
            <maximumFileSize value="1000KB" />
            <maxSizeRollBackups value="2" />
            <layout type="log4net.Layout.PatternLayout">
                <conversionPattern value="%date %level %thread %logger - %message%newline" />
            </layout>
        </appender>

        <logger name="NHibernate.SQL" additivity="true">
            <level value="ERROR" />
            <appender-ref ref="NHibernateAppender" />
        </logger>
    </log4net>