views:

161

answers:

1

Consider a typical NHibernate 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?
+2  A: 

There are a couple of ways to approach this problem:

  1. 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.

  2. You could either put in a call to Session.Refresh() inside your GetPerson() method to always get the most current state from the database or you could expose that functionality through your own Refresh() method.

  3. Alternatively, if you have a handle on the Person object itself, you could also try a Session.Evict() to remove the Person 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.

BryanD