Nhibernate и SetCacheable с кэшем второго уровня
Я использую репозиторий Rhino.Security для управления моими пользователями / ролями.
Процесс создания, удаления и связывания работает нормально, но я сталкиваюсь с проблемой, когда делаю запрос одним методом: GetAssociatedUsersGroupFor.
При первом вызове метода я не получаю никаких групп для своего пользователя, потому что я еще не создал никакой связи. На этом этапе я связываю пользователя с парой групп.
Я проверяю в БД, и я вижу ассоциацию.
Теперь я снова вызываю GetAssociatedUsersGroupFor, но я не могу получить группы.
С профилировщиком я видел, что в этот раз база данных не задействована. Я проверил код и обнаружил, что функция использует Nhibernate SetCacheable:
public virtual UsersGroup[] GetAssociatedUsersGroupFor(IUser user)
{
ICollection<UsersGroup> usersGroups =
SecurityCriterions.AllGroups(user)
.GetExecutableCriteria(session)
.AddOrder(Order.Asc("Name"))
.SetCacheable(true)
.List<UsersGroup>();
return usersGroups.ToArray();
}
Поскольку я не хочу менять код Rhino.Security, я хотел бы знать, могу ли я переопределить или изменить это поведение каким-либо образом.
ОБНОВИТЬ:
Я использую эту инструкцию для получения связанных групп:
AuthorizationRepository.GetAssociatedUsersGroupFor(User);
Я ассоциирую с этим кодом:
AuthorizationRepository.AssociateUserWith(User, grpName);
и отсоединить:
AuthorizationRepository.DetachUserFromGroup(User, groupToRemove.Name);
ОБНОВИТЬ
Я обнаружил, что я оставил кэш второго уровня в моей конфигурации:
<property name="cache.provider_class">NHibernate.Caches.SysCache.SysCacheProvider, NHibernate.Caches.SysCache</property>
<property name="cache.use_second_level_cache">true</property>
<property name="cache.use_query_cache">true</property>
Я думал, что было бы хорошо иметь кэш II уровня для повышения производительности, но, похоже, я был совершенно неправ.
Есть ли кто-нибудь, кто может помочь мне понять, что здесь происходит?
1 ответ
Есть проблема с Rhino.security.
Мне удалось решить проблему, даже если мне это не нравится.
Я звонил SessionFactory.EvictQueries()
когда я меняю ассоциацию и все работает нормально.