Кэш запросов NHibernate не работает после обновления базы данных - PullRequest
2 голосов
/ 02 сентября 2010

Я включил кэш 2-го уровня в FluentNHibernate:

Fluently.Configure()
            .Database(MsSqlConfiguration.MsSql2005
            .ConnectionString(connectionString)
            .Cache(c => c.ProviderClass<SysCacheProvider>().UseQueryCache())
            )
            .Mappings(m => m.FluentMappings.AddFromAssemblyOf<PersonMap>());

Мое сопоставление выглядит следующим образом:

    public PersonMap()
    {
        Id(x => x.Id);
        Map(x => x.Name);
        Cache.ReadWrite();
    }

Когда я вызываю людей из моего хранилища, я запускаю:

    var query = session.GetSession().CreateCriteria<Person>("p")
        .Add(Expression.Eq("p.Org.Id", orgRep.GetOrg().Id));
    query.SetCacheable(true);
    return query.List<Person>().AsQueryable<Person>();

При запуске приложения все (включая кеш) работает нормально.Мой первый запрос попадет в базу данных, а следующие нет.Проблема возникает, когда я спасаю Человека.Персона сохраняется как:

public virtual void Save(Person p)
{
  if (p.Id > 0 && session.GetSession().Get<Person>(p.Id).Org != orgRep.GetOrg())
            throw new SecurityException("Organization mismatch");
  session.GetSession().Merge(p);
  session.GetSession().Flush();
}

Сохранение работает, но после этого кеш - нет.Запросы всегда будут попадать в базу данных.Просмотр журнала nhibernate говорит, что:

 DEBUG - Checking query spaces for up-to-dateness [[Person]]
 DEBUG - Fetching object 'NHibernate-Cache:UpdateTimestampsCache:[Person]@1639794674' from the cache.
 DEBUG - cached query results were not up to date for: sql: SELECT this_.Id as Id0_0_, this_.Name as Name0_0_, this_.Org_id as Org5_0_0_ FROM [Person] this_ WHERE this_.Org_id = ?; parameters: ['1']; first row: 0

Что я делаю не так?

1 Ответ

0 голосов
/ 22 декабря 2011

Попробуйте создать явную транзакцию в сеансе, используя блок. Эта статья выглядит актуальной: - http://nhprof.com/Learn/Alerts/DoNotUseImplicitTransactions

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...