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() когда я меняю ассоциацию и все работает нормально.

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