考虑典型的NHibernate上下文类。
public class SampleContext : NHibernateContext
{
public SampleContext(ISession session)
: base(session)
{ }
public IQueryable<Person> People
{
get { return Session.Linq<Person>(); }
}
public Person GetPerson(int id)
{
get { return Session.Linq<Person>().SingleOrDefault(p => p.ID == id); }
}
}
我的问题:
- 我怎样才能重写GetPerson方法来忽略缓存并直接从数据库中检索数据?
答案 0 :(得分:9)
有几种方法可以解决这个问题:
Hibernate的人会告诉你,你可能应该打开一个不同的会话,以便从数据库中检索最新的数据。他们会指出,会议的目的是确定一个相对短暂的工作单位。
您可以在Session.Refresh()
方法中调用GetPerson()
以始终从数据库中获取最新状态,也可以通过自己的{{1}公开该功能方法。
或者,如果您有Refresh()
对象本身的句柄,您还可以尝试Person
删除会话缓存中的Session.Evict()
对象,然后重新加载它
根据我的经验,我已经尝试了#2和#3,最终总是来重构#1。