1

这是我的基本情况。我正在尝试使用 NHibernate 从数据库中获取信息,根据映射创建一些对象,对它们进行序列化,然后将序列化的对象移动到闪存组件上。没有构建错误发生,但是当我返回“序列化”对象时,它一直返回 null。在插入一些断点并逐步完成后,我意识到一切都在往南走。

我把我的断点放在这里:

var tasks = (List<CSH_Task>)persistanceManager.RetrieveAll<CSH_Task>(SessionAction.BeginAndEnd);

它进入我的 PersistanceManager 类,成功传递了我的 CSH_Task:

public IList<T> RetrieveAll<T>(SessionAction sessionAction)
    {
        /* Note that NHibernate guarantees that two object references will point to the
         * same object only if the references are set in the same session. For example,
         * Order #123 under the Customer object Able Inc and Order #123 in the Orders
         * list will point to the same object only if we load Customers and Orders in 
         * the same session. If we load them in different sessions, then changes that
         * we make to Able Inc's Order #123 will not be reflected in Order #123 in the
         * Orders list, since the references point to different objects. That's why we
         * maintain a session as a member variable, instead of as a local variable. */

        // Open a new session if specified
        if ((sessionAction == SessionAction.Begin) || (sessionAction == SessionAction.BeginAndEnd))
        {
            m_Session = m_SessionFactory.OpenSession();
        }

        // Retrieve all objects of the type passed in
        ICriteria targetObjects = m_Session.CreateCriteria(typeof(T));
        IList<T> itemList = targetObjects.List<T>();

        // Close the session if specified
        if ((sessionAction == SessionAction.End) || (sessionAction == SessionAction.BeginAndEnd))
        {
            m_Session.Close();
            m_Session.Dispose();
        }

        // Set return value
        return itemList;
    }

这直接来自NHibernate 的一个旧示例(我对它非常陌生)它让我进入一个“无可用资源”页面,其中列出了这个

调用堆栈位置:

Iesi.Collections.DLL!Iesi.Collections.Generic.HashedSet.HashedSet() 第 18 行

源文件信息:

查找 'd:\CSharp\NH\NH_Hg\nhibernate\src\Iesi.Collections\Generic\HashedSet.cs' 的源。校验和:MD5 {d3 1c 6c 95 94 c0 cb d4 b5 8d 8c 42 c5 4a 37 b2}

文件 'd:\CSharp\NH\NH_Hg\nhibernate\src\Iesi.Collections\Generic\HashedSet.cs' 不存在。

在脚本文档中查找 'd:\CSharp\NH\NH_Hg\nhibernate\src\Iesi.Collections\Generic\HashedSet.cs'...

在项目中查找 'd:\CSharp\NH\NH_Hg\nhibernate\src\Iesi.Collections\Generic\HashedSet.cs'。

在项目中找不到该文件。

查看目录'C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\crt\src\'...

查看目录 'C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\atlmfc\src\mfc\'...

查看目录'C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\atlmfc\src\atl\'...

查看目录 'C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\atlmfc\include\'... 查看目录 'C:\Users\tackiean\Desktop\'...

查看目录 'E:\SmartMC\NHibernate\Required_Bins\'...

源位于“E:\SmartMC\NHibernate\Required_Bins\HashedSet.cs”。

确定校验和是否与以下位置匹配:

1:E:\SmartMC\NHibernate\Required_Bins\HashedSet.cs 校验和:MD5 {40 1b 39 7e 8f 4a 3f 6 11 41 88 70 9e 8f 8 f1} 校验和不匹配。

活动解决方案的调试源文件设置表明调试器不会要求用户查找文件:d:\CSharp\NH\NH_Hg\nhibernate\src\Iesi.Collections\Generic\HashedSet.cs。

调试器找不到源文件 'd:\CSharp\NH\NH_Hg\nhibernate\src\Iesi.Collections\Generic\HashedSet.cs'。

如果我继续单步执行它会返回我的代码,然后返回此处列出关于 DictionarySet.cs 的几乎相同的消息

我不是第一个在这台机器上为这个项目下载 NHibernate 的人,但我会想象如果它需要 HashedSet.cs/DictionarySet.cs 才能工作,它们会默认包含在内吗?我今天花了大约 7 个小时来寻找这个问题的答案,但我空空如也。我以前从未见过这样的错误。我认为它只是在寻找 NHibernate 需要的文件,但找不到,但这里还有其他事情吗?任何帮助将不胜感激。我希望这是一个合适的位置/格式清晰;我以前从来没有在这里问过问题,所以我希望这不是完全不合适的。

4

2 回答 2

0

HashedSet 和 DictionarySet 是 Iesi.Collections 的一部分,Iesi.Collections 是 NHibernate 包含的一个集合库。NHibernate 的二进制包通常包含 .pdb 文件,其中包含程序集的调试信息。当调试器想要打开源文件时,它在你的机器上找不到它们,因为包含的源路径是包维护者的路径。

如果您愿意,您可以在GitHub 上下载 NHibernate 源代码并自己编译程序集。然后调试器会在发生异常时自动查找源文件(编译后不要移动源文件)。

您应该稍微修改一下您的 RetrieveAll 方法,因为您必须始终打开一个会话并在某个地方关闭它。通常,您会执行以下操作:

using (ISession sess = factory.OpenSession())
using (ITransaction tx = sess.BeginTransaction())
{
    try
    {
        var crit = sess.CreateCriteria<T>();
        var list = crit.List<T>();

        // Do something with list

        tx.Commit();
    }
    catch (Exception)
    {
        tx.Rollback();
    }
}

如果要将查询的列表返回给调用者,会话将被关闭。因此,请确保您的查询列表中没有未初始化的延迟加载代理。您可以阅读NHibernate 文档中的延迟/急切加载部分。希望,我可以帮助你的问题。

于 2012-05-16T17:30:15.250 回答
0

您看到的消息是您的调试器尝试查找源代码,因为您正在单步执行它。您的机器上缺少该源代码不会影响 NHibernate 运行时。

于 2012-05-17T10:49:28.533 回答