2015-03-20 2 views
0

Я использую NHibernate 3.3 с кешем второго уровня Syscache, и я пытаюсь вырезать объект из кеша 2-го уровня, но он, похоже, не работает.Эквивалент элементов кэша второго уровня Syscache/Nhibernate

Я использую этот код, основанный на других примерах:

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-го уровня, чтобы синхронизировать их.

ответ

0

Очистить кэш 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); 
    } 
Смежные вопросы