Nhibernate и SetCacheable с кешем второго уровня

Я использую репозиторий Rhino.Security для управления своими пользователями/ролями.
Процесс создания, удаления и связывания работает нормально, но я сталкиваюсь с проблемой при запросе с использованием одного метода: GetAssociatedUsersGroupFor.
При первом вызове метод, я не получаю никаких групп для своего пользователя, потому что я еще не создал никакой ассоциации. В этот момент я связываю пользователя с парой групп.
Я проверяю базу данных и вижу ассоциацию.
Теперь я снова вызываю GetAssociatedUsersGroupFor, но не могу получить ни одной группы.
С помощью profiler Я видел, что на этот раз база данных не задействована. Я проверил код и обнаружил, что функция использует 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 уровня для повышения производительности, но, похоже, я был совершенно неправ.
Кто-нибудь может попытаться помочь мне понять, что здесь происходит?


person LeftyX    schedule 01.02.2011    source источник
comment
Можете ли вы опубликовать свой код, где вы сохраняете новые ассоциации и впоследствии извлекаете их?   -  person nkirkes    schedule 01.02.2011
comment
@mannish: я приложил код. Это очень просто. Как я уже сказал, я могу найти записи в БД, так что все работает нормально. Я перекомпилировал модуль Rhino.Security с комментарием здесь: .SetCacheable(true) и все работает нормально, но я хотел бы этого избежать.   -  person LeftyX    schedule 01.02.2011
comment
И чтобы было ясно, это происходит на отдельных сессиях NHib, верно? Вы не делаете все это в рамках одного сеанса? Если записи попадают в базу данных, я предполагаю, что это разные сеансы/транзакции.   -  person nkirkes    schedule 01.02.2011
comment
@mannish: да, потому что мое приложение - ASP.NET MVC. Я открываю сеанс и сохраняю данные. Тогда сеанс закрывается. Если я пытаюсь изменить данные, я открываю другой сеанс, извлекаю данные и замечаю, что запрос возвращает предыдущую информацию до сохранения.   -  person LeftyX    schedule 02.02.2011


Ответы (1)


Возникла проблема с rhino.security. .
Мне удалось решить проблему, даже если она мне не нравится.
Я вызывал SessionFactory.EvictQueries(), когда меняю ассоциацию, и все работает нормально.

person LeftyX    schedule 14.02.2011