Удалить удаленные элементы из кэша первого уровня в NHibernate? Или: как проверить, были ли кэшированные элементы удалены?

У нас есть многопользовательское приложение brownfield (99% Delphi, 1% .net), которое использует NHibernate для устойчивости модулей.net. В моем приложении я могу добавить категории к какой-либо сущности. Если я выберу один и решу не использовать его (таким образом, удаляя категорию снова), я был загружен NHibernate и останусь в кэше первого уровня сеанса. Теперь, если какой-то другой пользователь удаляет эту категорию, и я пытаюсь сохранить свою сущность, мое приложение выдает исключение, потому что загруженный объект больше не существует.

мой вопрос: есть ли способ проверить, загружены ли в мой кэш элементы, которые больше не существуют? и если да, есть ли способ удалить несуществующие объекты из моего кэша?

Итак, что происходит: я загружаю объект (добавляемый в кэш сеанса), добавляю категорию (добавляемый в кэш сеанса) Кто-то еще удаляет категорию из базы данных. Я сохраняю свою сущность, и исключение происходит, потому что категория больше не существует.

Это все еще в кеше сессии. Было бы хорошо, если бы я мог (автоматически) удалить его из кеша моей сессии? Есть ли способ очистить кеш и удалить объекты, которые больше не существуют?

С уважением, Тед

1 ответ

Решение

В NHibernate нет возможности сделать это автоматически, по крайней мере, с ISession, Вы могли бы использовать IStatelessSession для загрузки, поскольку у него нет кэша первого уровня, но вы потеряете много других функций, которые ISession обеспечивает.

Вы также можете позвонить ISession.Clear() очистить кэш сеанса (первого уровня) или ISession.Evict() изгнать определенные сущности из сессии, но это не автоматически.

Как долго вы сохраняете объект сеанса? Может быть, вам нужен другой контекст управления сеансом.

Если продолжительность вашего сеанса короче, вы все равно можете добиться кэширования сущностей, но с помощью кэша второго уровня. SysCache2 - один из провайдеров кэша второго уровня, который поддерживает SqlCacheDependency, Это означает, что вы можете установить срок действия кэша при изменении некоторых объектов в базе данных.

Другие вопросы по тегам