更新后如何使用NHibernate从数据库中检索最新信息?

时间:2020-03-06 14:46:50  来源:igfitidea点击:

这是场景:

我有一个使用NHibernate的winforms应用程序。启动后,我用NHibernate查询的结果填充DataGridView。这部分工作正常。如果我更新了该列表中的一条记录并刷新了该会话,则更新将进入数据库。在更新后关闭表单后,我调用一个方法来检索对象列表,以再次填充DataGridView以获取更改,并获取其他人可能发生的任何其他更改。问题在于,已更新的记录NHibernate并未在它给我的列表中反映出更改。当我插入或者删除记录时,一切正常。只是在我更新时,我才得到这种行为。我通过其缓存机制将其范围缩小到了NHibernate。我无法找出一种使NHibernate从数据库检索的方法,而不是在更新发生后使用缓存的方法。我在NHibernate论坛上发帖,但是他们给我的建议没有用。我说了这个,没有人回答。我不会陈述我尝试过的情况,以防万一我做错了。如果我们以我尝试过的方式回答,我会在回答注释中注明。

这是我用来检索列表的代码:

public IList<WorkOrder> FindBy(string fromDate, string toDate)
{
    IQuery query = _currentSession.CreateQuery("from WorkOrder wo where wo.Date >= ? and wo.Date <= ?");
    query.SetParameter(0, fromDate);
    query.SetParameter(1, toDate);
    return query.List<WorkOrder>();
}

会话在构造时传递给该类。我也可以发布映射文件,但是我不确定它是否有问题,因为其他所有方法都可以。有人看过吗?这是我使用NHibernate的第一个项目,感谢帮助。

解决方案

刷新呢?见9.2. 加载文档的对象:

" sess.Save(cat);
sess.Flush(); //强制执行SQL INSERT
sess.Refresh(cat); //重新读取状态(执行触发器后)
"

更新后,从一级缓存中逐出对象。

Session.Update(obj);
Session.Evict(obj);

我们可能要先提交和/或者刷新。