Nhibernate LINQ - проблемы с кешированием - PullRequest
2 голосов
/ 29 октября 2010

У меня есть следующий код

factory = new Configuration().Configure().BuildSessionFactory();
session = factory.OpenSession();
var query = session.Linq<Root>();
var data = query.ToList<Root>();
var data2 = query.ToList<Root>();

Этот генерирует 2 запроса SQL, поэтому я понимаю, что кэш первого уровня не работает.Управляет ли LINQ для nhibernate кешем первого уровня?Если да, то как это настроить?

Спасибо заранее.

1 Ответ

6 голосов
/ 29 октября 2010

Это ошибочное мнение, что кэш первого уровня избегает выполнения sql в целом.

Запросы всегда выполняются в базе данных. Это дает 100% уверенность в том, что результат точно такой же, независимо от того, находятся ли экземпляры в памяти или нет. Это может быть важно, например, при использовании соединений или условий. Нет разницы, если запрос действительно содержит объединения или предложение where.

Кэш первого уровня гарантирует, что возвращается тот же экземпляр, если он представляет один и тот же экземпляр в базе данных. NHibernate выполняет sql, когда он находит в памяти тот же объект, который был возвращен запросом, а затем возвращает объект в кеше. Но он не может знать, прежде чем выполнять sql.

Только когда вы используете session.Get или session.Load, NH выполняет поиск в кэше и избегает запроса при обнаружении экземпляра.

AFAIK, Linq для NHibernate ничего не делает с кешем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...