Выселить элементы кэша 2-го уровня Syscache/Nhibernate
Я использую NHibernate 3.3 с кешем 2-го уровня Syscache и пытаюсь удалить объект из кеша 2-го уровня, но, похоже, он не работает.
Я использую этот код на основе других примеров:
var CollectionCache = NHibernateSessionFactory.Instance.GetAllCollectionMetadata();
var ClassCache = NhibernateSessionFactory.Instance.GetAllClassMetadata();
NhibernateSessionFactory.Instance.EvictQueries();
foreach (var collectionMetadata in NhibernateSessionFactory.Instance.GetAllCollectionMetadata())
NhibernateSessionFactory.Instance.EvictCollection(collectionMetadata.Key);
foreach (var classMetadata in NhibernateSessionFactory.Instance.GetAllClassMetadata())
NhibernateSessionFactory.Instance.EvictEntity(classMetadata.Key);
После вытеснения CollectionCache и ClassCache по-прежнему имеют одинаковое количество элементов.
Также, NhibernateSessionFactory.Instance.Evict(typeof(someObject), SomeObjectId);
кажется, не имеет никакого эффекта.
Мой пример использования: я работаю с отсоединенными объектами, и когда другое приложение вносит изменения в базу данных, мне нужно удалить эти элементы из кэша 2-го уровня, чтобы поддерживать его в синхронизации.
1 ответ
Очистить 2-уровневый кеш nHibernate (у меня этот метод работал):
private void ClearCache()
{
_repositoryFactory.GetSession().Clear();
var sf = _repositoryFactory.GetSession().SessionFactory;
sf.EvictQueries();
foreach (var collectionMetadata in sf.GetAllCollectionMetadata())
sf.EvictCollection(collectionMetadata.Key);
foreach (var classMetadata in sf.GetAllClassMetadata())
sf.EvictEntity(classMetadata.Key);
}