- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在 Nhibernate 3 中遇到 Futures 问题,无法意识到问题出在哪里。
以下代码(没有 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 是不同的。听起来像是一个线程问题,但奇怪的是它在没有 future 的情况下也能工作。但是我没有使用线程来加载数据,只是为了添加项目(嗯,但也许,因为我在添加项目时通知,并且我加载项目以回答“那个消息”,我认为加载将是在另一个线程中执行)
编辑 2:该错误似乎很随机。有时我明白了,有时不明白 :S
最佳答案
我想我已经找到问题了。
这听起来可能很愚蠢,但我认为这是有道理的。我不得不交换这些行:
ItemList = result;
TotalResults = count.Value;
所以他们结果
TotalResults = count.Value;
ItemList = result;
问题基本上是多线程(我想我在我的问题中并没有提到它,但错误的随机性有点可疑)。因此,首先,我将告诉您一些背景知识,以便解决方案更加清晰:
当一个新元素被添加到数据库时,一条消息被(全局)发送,所以每个“感兴趣”的人都可以更新它的元素以反射(reflect)变化。当我使用 MVVM Light 时,我是这样做的:
Messenger.Default.Send(new DataReloadSuggested<MyEntityType>(theUpdatedId));
我正在使用 Tasks 来添加元素,所以当我点击“添加”按钮时,会执行如下操作:
Task.Factory.StartNew(CommitCurrentItem);
并且,在 CommitCurrentItem 中,我将项目添加到数据库并通知程序列表已更新(发送消息如上所述)。
我的主表单注册了该消息,如下所示:
Messenger.Default.Register<DataReloadSuggested<T>>(this, true, unused => LoadPage(CurrentPage));
即使 LoadPage 函数没有手动创建不同的线程(在那一刻),它也是在与 CommitCurrentItem 相同的线程中执行的。不能保证 Task 在不同的线程中运行,但在这种情况下它是。 LoadPage 只是调用了问题中的代码。我的代码保证在 UI 线程中引发 PropertyChanged 事件(来自 INotifyPropertyChanged 接口(interface)),因此当我设置 ItemList 属性(IEnumerable 类型)时,UI 会收到通知,因此它会显示新列表。因此,UI 检索了 ItemList 的新值,同时(在另一个线程中)行 TotalResults = count.Value;
正在执行。在这种情况下,我猜想在检索到第一个值(列表中的第一项或 RowCount)之前,不会对数据库执行查询。请记住,ISession 不是线程安全的,因此这种情况是不可靠的:UI 线程和其他线程同时使用同一个 session 。在我的代码中,我没有在 ViewModel 之间共享 session ,并且每个 ViewModel 同时仅使用一个线程使用 session ,以防止出现这种情况。
所以,最终的解决方案是强制在我正在工作的同一个线程中执行查询,所以我简单地调用了count.Value
。设置前 ItemList
至 result
.
关于c# - Count + List with Futures 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13999540/
今天有小伙伴给我留言问到,try{...}catch(){...}是什么意思?它用来干什么? 简单的说 他们是用来捕获异常的 下面我们通过一个例子来详细讲解下
我正在努力提高网站的可访问性,但我不知道如何在页脚中标记社交媒体链接列表。这些链接指向我在 facecook、twitter 等上的帐户。我不想用 role="navigation" 标记这些链接,因
说现在是 6 点,我有一个 Timer 并在 10 点安排了一个 TimerTask。之后,System DateTime 被其他服务(例如 ntp)调整为 9 点钟。我仍然希望我的 TimerTas
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我就废话不多说了,大家还是直接看代码吧~ ? 1
Maven系列1 1.什么是Maven? Maven是一个项目管理工具,它包含了一个对象模型。一组标准集合,一个依赖管理系统。和用来运行定义在生命周期阶段中插件目标和逻辑。 核心功能 Mav
我是一名优秀的程序员,十分优秀!