这是我的基本情况。我试图使用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:\程序文件(X86)\MicrosoftVisualStudio10.0\VC\crt\src\’. 查看目录‘C:\程序文件(X86)\10.0\VC\atlmfc\src\mfc\. 查看目录‘C:\程序文件(X86)\10.0\VC\atlmfc\src\atl\’. 查看目录‘C:\程序文件(X86)\MicrosoftVisualStudio10.0\VC\atlmfc\include\’.在目录‘C:\Users\tackiean\Desktop\’. 查找目录‘E:\SmartMC\NHibernate\必需_Bins\’. 来源在'E:\SmartMC\NHibernate\Required_Bins\HashedSet.cs'. 确定下列位置的校验和是否匹配: 1:E:\SmartMC\NHibernate\Required_Bins\HashedSet.cs校验和: MD5 {40 1b 39 7e 8f4a 3f6 11 41 88 70 9e 8f8 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需要的文件,却找不到,但是这里还有什么其他的东西吗?任何帮助都将不胜感激。我希望这是一个合适的位置/清晰地格式化;我以前从未在这里提出过任何问题,所以我希望这不是完全不合适的。
发布于 2012-05-16 17:30:15
HashedSet和DictionarySet是Iesi.Collections的一部分,这是NHibernate中包含的一个集合库。NHibernate的二进制包通常包括包含程序集调试信息的.pdb文件。当调试器想要打开源文件时,它在您的机器上找不到它们,因为包含的源路径是包维护者的源路径。
如果愿意,可以在NHibernate上下载GitHub源代码并自己编译程序集。然后,当出现异常时,调试器将自动找到源文件(编译后不要移动源文件)。
您应该修改一下您的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-17 10:49:28
您看到的消息是您的调试器试图查找源代码,因为您正在逐步执行它。计算机上缺少该源代码不会影响NHibernate运行时。
https://stackoverflow.com/questions/10607213
复制相似问题