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

当NHibernate找不到实体时,是否有方法跟踪试图加载它的内容?,nhibernate,Nhibernate,我有一个厚客户端应用程序,其中有很多相当复杂的对象相互关系。有时,我有一个实例,其中A引用实体X,该实体X被删除。数据库保存得很好,但在重新加载时,我得到了可怕的NHibernate.unsolvableObjectException:不存在具有给定标识符的行[X#1] 我承认这是我软件中的一个缺陷,也是我必须修复的一个缺陷。同时,现实开始出现,我需要修复数据库——但是我如何修复它实际上取决于引用它的内容。我找不到任何简单的方法来告诉你 它可能是实体A,也可能是实体B-Z。我也不知道引用实体上的

我有一个厚客户端应用程序,其中有很多相当复杂的对象相互关系。有时,我有一个实例,其中A引用实体X,该实体X被删除。数据库保存得很好,但在重新加载时,我得到了可怕的
NHibernate.unsolvableObjectException:不存在具有给定标识符的行[X#1]

我承认这是我软件中的一个缺陷,也是我必须修复的一个缺陷。同时,现实开始出现,我需要修复数据库——但是我如何修复它实际上取决于引用它的内容。我找不到任何简单的方法来告诉你

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

我知道您可以设置Configuration.EntityNotFoundDelegate,还可以指定
引用(x=>x.B).NotFound.Ignore()
(或NHibernate中的等效项)。但这并没有让我更接近于找出什么是引用它的。我通常只能通过我的数据库进行有时是艰苦而彻底的搜索

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

理想情况下,我会记录这些信息。然而,即使我通过调试器运行它,也只能获得很少的信息,因为异常被抛出到NHibernate代码的深处。
但是,即使在运行时尝试通过调试器运行它,也可以尝试使用内置的SQL日志记录/调试日志记录。它应该告诉你NHibernate想要做的一切

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

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

然后,添加实际的log4net配置部分。设置appender和logger。在本例中,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>

尝试使用内置的SQL日志记录/调试日志记录。它应该告诉你NHibernate想要做的一切

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

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

然后,添加实际的log4net配置部分。设置appender和logger。在本例中,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>


您是否记录了NHibernate正在生成和执行的SQL?这经常帮助我追踪几乎每一个奇怪的问题。内森,我是,但我甚至没有想到这一点。森林/树木等等。如果你想给出一个正确的答案,我会给它打勾。完成了,我完全知道你对森林/树木的意思…你是否记录了NHibernate正在生成和执行的SQL?这经常帮助我追踪几乎每一个奇怪的问题。内森,我是,但我甚至没有想到这一点。森林/树木等等。如果你想给出一个正确的答案,我会给它打勾。完成了,我完全知道你说的森林/树木是什么意思。。。