我在Nhibernate 3中遇到了期货问题,无法识别出什么问题。Count +期货不能正常工作
下面的代码(不含期货),按预期工作:
SessionHandler.DoInTransaction(transaction =>
{
var criteria = SessionHandler.Session.CreateCriteria<T>();
var clonedCriteria = (ICriteria)criteria.Clone();
var count = criteria
.SetProjection(Projections.RowCount())
.UniqueResult<Int32>();
var result = clonedCriteria
.SetMaxResults(PageSize)
.SetFirstResult(page * PageSize)
.List<T>();
ItemList = result;
TotalResults = count;
RecalculatePageCount();
});
SessionHandler只是存储此上下文的会话,并DoInTransaction是一个方便的方法:
public void DoInTransaction(Action<ITransaction> action)
{
using (var transaction = Session.BeginTransaction())
{
action(transaction);
transaction.Commit();
}
}
现在,以下代码导致GenericAdoException:
SessionHandler.DoInTransaction(transaction =>
{
var criteria = SessionHandler.Session.CreateCriteria<T>();
var clonedCriteria = (ICriteria)criteria.Clone();
var count = criteria
.SetProjection(Projections.RowCount())
.FutureValue<Int32>();
var result = clonedCriteria
.SetMaxResults(PageSize)
.SetFirstResult(page * PageSize)
.Future<T>();
ItemList = result;
TotalResults = count.Value;
RecalculatePageCount();
});
我正在使用PostgreSQL 9.2,Npgsql 2.0.11.0和NHibernate 3.3.1.4000。如果这很重要,我使用流利NHibernate的映射 谢谢你的任何建议。
编辑: 经过更多的研究,我发现这个错误只发生在我添加一个项目后。在开始时,我在我的表单中加载数据,它工作得很好。当我在添加项目后在表单中重新加载数据时,出现异常。但这很奇怪。该项目被正确添加。用于添加或更新项目的代码如下所示:
if (IsEditing)
{
SessionHandler.DoInTransaction(tx => SessionHandler.Session.Update(CurrentItem));
}
else
{
SessionHandler.DoInTransaction(tx => SessionHandler.Session.Save(CurrentItem));
}
什么奇怪的是,我(有时候,我认为)让当我提高PropertyChanged事件此异常。我注意到有时候InnerException是不同的。听起来像是一个线程问题,但奇怪的是它没有未来。但我没有使用线程来加载数据,只是添加项目(嗯,但也许,因为我通知何时添加项目,并加载项目以回答“该消息”,我认为该负载将是在另一个线程执行)
编辑2: 错误似乎很随机。有时候我明白了,有时候不是:S
什么是内部异常? GenericADOException只是NHibernate的全局数据库异常封装。 –
我得到NotsupportedException:后端发送无法识别的响应类型:\ 0 我也在Npgsql中得到DataException –
根据你的说法,使用踏步似乎令人怀疑。 –