2009-01-14 65 views
0

长标题,我知道,但我搜遍了所有,并找不到来自该函数调用的错误消息,所以我认为这可能会更有用。NHibernate IQuery.List错误“该计数= 4的SqlParameterCollection的索引4无效。”

这是代码片段:

string hql = " from LabRequest r where 1 = 1 "; 
hql += " and 0 < (select count(rs) "; 
hql += "   from r.Statuses rs "; 
hql += "   where rs.StatusType.Description IN ('Assigned','Submitted')"; 
hql += "  ) "; 
//Session.Clear();   
IQuery query = Session.CreateQuery(hql); 
IQueryable<LabRequest> requests = query.List<LabRequest>().AsQueryable<LabRequest>(); 

这是一个函数(或大部分)在我的数据访问对象在MVC应用我工作。这是一个搜索页面,当页面运行时,这个函数会被调用,就像你在代码中看到的一样,并且工作。

然后,在不更改任何内容的情况下,我刷新了通过相同步骤并调用此代码的页面,就像您再次看到它一样。但第二次通过它崩溃在最后一行的query.List()部分与主题中的错误。

会议在另一个DAO定义为:

session = NHibernateHelper.GetCurrentSession(); 

我知道这很难不实际的数据库进行分析,但我只是想看看是否有人也许可以点我在正确的方向,也许点因为我基本上不知道关于NHibernate的一些事情。

编辑:忘记提及,当我取消注释Session.Clear()它工作正常,所以认为答案与这个有关,如果它确实如何处理何时清除()?

编辑2:这是答案的一部分,但我第二次在此之前调用一个非常类似的函数。我无法弄清的是为什么那个影响我发布的那个。 '查询'变量是本地的,所以它似乎是Session.CreateQuery的东西。任何人都知道那会是什么?

感谢, 杰夫

+0

您是否检查过日志输出? – 2009-01-14 22:06:02

+0

抱歉,不确定你的意思是什么日志。错误日志只是说我在主题中输入的内容? – 2009-01-14 22:30:05

回答

0

虽然我不知道到底为什么它似乎“统计信息”的会议酒店,从第一次查询就可以了数据,我认为这是什么引起的错误,因为如果我做一个Session.Clear它删除Statistics属性中的集合。

作为我目前的和可能的临时解决方案,我只是为CreateQuery函数创建了一个扩展方法,它需要一个bool询问是否清除会话,并且只是使用它而不是提供的。

如果其他人有任何真实的答案,请添加它。

0

关于您的“编辑1”和“编辑2”笔记,是的,它与共享的会话有关(假设您使用NHibernate中处理会话的标准方法之一)。

是否有充分的理由使用Session.Clear()?通常,只有在刷新后才使用Clear,以确保Session缓存不会太大而导致性能下降。您是以这种方式使用它,还是出于您的问题中未提及的某些商业原因?

相关问题