NHibernate: как я могу игнорировать кэш и перейти непосредственно к базе данных?


Рассмотрим типичный контекст класса 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 3

1 ответ:

Есть несколько способов подойти к этой проблеме:

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

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

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

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