我正在使用NHibernate 3.0配置二级缓存。实体和集合的二级缓存效果很好但我也有一些实体具有过滤集合。
<bag name="EntityTrans" cascade="all-delete-orphan" table="EntityTrans">
<key column="entityId" not-null="true" />
<one-to-many class="MyDomain.EntityTran, MyDomain" />
<filter name="cultureFilter" condition=":cultureCode = CultureCode" />
</bag>
NHibernate二级缓存不会缓存上面的过滤后的集合。我可以在NHProf中看到过滤的集合查询被发送到数据库。我的NHibernate配置文件包含以下条目。
<class-cache class="MyDomain.EntityTran, MuDomain" region="MyRegion" usage="read-only"/>
<collection-cache collection="MyDomain.Entity.EntityTrans" region="MyRegion" usage="read-only"/>
我是否需要添加更多内容来缓存已过滤的集合?
答案 0 :(得分:8)
目前,NHibernate不支持过滤集合的二级缓存。
首先我找到了forum post。然后我查看了代码(CollectionLoadContext.cs ~line 299)并找到了以下内容:
if (!(session.EnabledFilters.Count == 0) && persister.IsAffectedByEnabledFilters(session))
{
// some filters affecting the collection are enabled on the session, so do not do the put into the cache.
log.Debug("Refusing to add to cache due to enabled filters");
// todo : add the notion of enabled filters to the CacheKey to differentiate filtered collections from non-filtered;
// but CacheKey is currently used for both collections and entities; would ideally need to define two separate ones;
// currently this works in conjunction with the check on
// DefaultInitializeCollectionEventHandler.initializeCollectionFromCache() (which makes sure to not read from
// cache with enabled filters).
return; // EARLY EXIT!!!!!
}