Подтвердить что ты не робот

Настроить кеширование на сущности и отношения в Fluent Nhibernate?

Есть ли у кого-нибудь пример, как настроить и какие объекты кэшировать в свободном nhibernate. Оба используются с плавным отображением и автоматическим отображением?

И то же самое для отношений сущностей, как один-ко-многим, так и многим-многим?

4b9b3361

Ответ 1

Я работаю в аналогичной ситуации, где я просто хочу кэшировать определенные элементы и хочу, чтобы эти элементы загружались один раз при запуске и сохранялись в кеше, пока приложение не будет закрыто. Это кеш только для чтения и используется для заполнения списка стран, чтобы пользователь мог выбрать свою страну из списка.

Я использовал fluentNhibernate Mappings и определил Country my class с Cache.readonly()

public class CountryMap : ClassMap<Country> {
    public CountryMap() { 
         Schema("Dropdowns");
         Cache.ReadOnly();
         // Class mappings underneath 
    }
}

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

public class UserMap : ClassMap<User> {
    Id(x => x.Id).Column("UserId");
    Map(x => x.FirstName);
    Map(x => x.LastName);
    References(x => x.Country)
      .Column("CountryId");
}

Я вручную настраиваю Fluent Nhibernate для использования кеша второго уровня. Итак, в моем свободном Confuguration у меня есть:

var sessionFactory = Fluently.Configure()
    .Database (...) // set up db here
    .Mappings(...)  //set up mapping here
    .ExposeConfiguration(c => {
        // People advice not to use NHibernate.Cache.HashtableCacheProvider for production
        c.SetProperty("cache.provider_class", "NHibernate.Cache.HashtableCacheProvider");
        c.SetProperty("cache.use_second_level_cache", "true");
        c.SetProperty("cache.use_query_cache", "true");
    })
    .BuildSessionFactory();

Я проверил в профилировщике SQL, и когда я получаю список стран для пользователя, они загружаются один раз, и я получаю кеширование после каждого другого запроса. Приятно то, что при отображении имени страны пользователя он загружается из кеша и не делает запрос в базу данных. Я получил несколько советов от этой публикации Габриэль Шенкер. Надеюсь, это поможет? Если вы нашли лучший/правильный способ, сообщите мне об этом? Спасибо!