NHibernate: Как мне проигнорировать кеш и перейти непосредственно к базе данных? - PullRequest
3 голосов
/ 14 декабря 2009

Рассмотрим типичный контекстный класс 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, чтобы игнорировать кэш и получать данные непосредственно из базы данных?

1 Ответ

9 голосов
/ 14 декабря 2009

Существует несколько способов решения этой проблемы:

  1. Ребята из Hibernate скажут вам, что вам, вероятно, следует открыть другой сеанс, чтобы получить последние данные из базы данных. Они отметили бы, что цель сессии - охватить относительно недолговечную единицу работы.

  2. Вы можете либо вызвать Session.Refresh() внутри вашего GetPerson() метода, чтобы всегда получать самое актуальное состояние из базы данных, либо вы можете предоставить эту функциональность с помощью собственного Refresh() метода.

  3. В качестве альтернативы, если у вас есть дескриптор самого объекта Person, вы также можете попробовать Session.Evict() удалить объект Person из кэша сеанса до его повторной загрузки.

По своему опыту, я пробовал оба # 2 и # 3 и в конце концов всегда приходил к рефакторингу, чтобы сделать # 1.

...