有没有人有一个例子如何设置以及在流畅的nhibernate中缓存哪些实体。两者都使用流畅的映射和自动映射?
同样的实体关系,包括一对多和多对多?
答案 0 :(得分:32)
我一直在处理类似的情况,我只想缓存特定的元素,并希望这些元素在启动时加载一次,并保存在缓存中,直到应用程序关闭。这是一个只读缓存,用于填充国家/地区列表,以便用户可以从列表中选择国家/地区。
我使用了fluentNhibernate Mappings,并使用Cache.readonly()
定义了Country my classpublic 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分析器,当我得到一个用户的国家列表时,它们被加载一次,并且在每个其他请求之后我得到缓存命中。好处是,当显示用户国家/地区名称时,它会从缓存中加载,并且不会向数据库发出请求。我从Gabriel Schenker的帖子中得到了一些提示。希望有帮助吗?如果您找到了更好/更合适的方式,请告诉我们?谢谢!