我在 Nhibernate 3 中遇到了 Futures 的问题,无法意识到出了什么问题。
以下代码(没有期货)按预期工作:
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 只是为这个上下文存储了一个 Session ,而 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。如果这很重要,我使用 Fluent NHibernate 进行映射谢谢您的任何建议。
编辑:经过更多研究,我发现此错误仅在添加项目后发生。在开始时,我在我的表单中加载数据,它工作得很好。添加项目后在表单中重新加载数据时出现异常。但这很奇怪。该项目已正确添加。添加或更新项目的代码如下所示:
if (IsEditing)
{
SessionHandler.DoInTransaction(tx => SessionHandler.Session.Update(CurrentItem));
}
else
{
SessionHandler.DoInTransaction(tx => SessionHandler.Session.Save(CurrentItem));
}
奇怪的是,当我引发 PropertyChanged 事件时,我(有时,我认为)得到了这个异常。我注意到有时 InnerException 是不同的。听起来像一个线程问题,但奇怪的是它没有期货。但我没有使用线程来加载数据,只是为了添加项目(嗯,但也许,因为我在添加项目时通知,并且我加载项目以响应“该消息”,我认为加载将是在另一个线程中执行)
编辑2:错误似乎很随机。有时我明白,有时没有:S