这是我的基本情况。我正在尝试使用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;
}
这是直接来自较旧的example of NHibernate(我是非常新的) 它让我陷入“无源可用”页面,列出了这个
调用堆栈位置:
Iesi.Collections.DLL!Iesi.Collections.Generic.HashedSet.HashedSet() 第18行
源文件信息:
找到源代码 D:\ CSHARP \ NH \ NH_Hg \的nhibernate \ SRC \ Iesi.Collections \通用\ 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。< / p>
调试器找不到源文件'd:\ CSharp \ NH \ NH_Hg \ nhibernate \ src \ Iesi.Collections \ Generic \ HashedSet.cs'。
如果我继续单步返回我的代码,那么回到这里列出一个关于DictionarySet.cs的几乎相同的消息
我不是那个首先在这台机器上为这个项目下载NHibernate的人,但我想象如果HashedSet.cs / DictionarySet.cs需要它才能工作,它们默认包括在内没有?我今天花了大约7个小时来寻找答案,但是我想要空了。我以前从未见过这样的错误。我认为它只是在寻找一个NHibernate需要的文件,而且找不到,但是还有什么东西在这里发生?任何帮助都会非常感激。我希望这个合适的位置/格式清晰;我以前从未问过这里的问题,所以我希望这不是完全不合适的。
答案 0 :(得分: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 documentation中的延迟/急切加载部分。希望,我可以帮助解决你的问题。
答案 1 :(得分:0)
您看到的消息是调试器,因为您正在逐步查找源代码。机器上缺少源代码不会影响NHibernate运行时。