Я работал в аналогичной ситуации, когда я просто хочу кэшировать определенные элементы и хочу, чтобы эти элементы загружались один раз при запуске и хранились в кэше до тех пор, пока приложение не будет закрыто. Это кэш только для чтения, который используется для заполнения списка стран, чтобы пользователь мог выбрать свою страну из списка.
Я использовал FluentNhibernate Mappings и определил Country моего класса с помощью 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, и когда я получаю список стран для пользователя, они загружаются один раз, и я получаю попадания в кэш после каждого другого запроса. Приятно то, что при отображении имени страны пользователя он загружается из кеша и не делает запрос к базе данных. Я получил несколько советов из этой публикации Габриэль Шенкер . Надеюсь, это поможет? Если вы нашли лучший / правильный способ, пожалуйста, дайте мне знать? Спасибо!