NHibernate: How do I ignore the cache and go directly to the database?
Consider a typical NHiber开发者_运维问答nate context class.
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); }
}
}
My question:
- How could I rewrite the GetPerson method to ignore the cache and retrieve data directly from the database?
There are a couple of ways to approach this problem:
The Hibernate guys will tell you that you probably should be opening a different session in order to retrieve the latest data from the database. They would point out that the intention of the session is to be scoped to a relatively short-lived unit of work.
You could either put in a call to
Session.Refresh()
inside yourGetPerson()
method to always get the most current state from the database or you could expose that functionality through your ownRefresh()
method.Alternatively, if you have a handle on the
Person
object itself, you could also try aSession.Evict()
to remove thePerson
object your session cache prior to loading it again.
In my experience, I've tried both #2 and #3 and have eventually always come around to refactoring to do #1.
精彩评论