Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NHibernate查询缓存每行发出一个请求以获取实体_C#_.net_Nhibernate_Second Level Cache - Fatal编程技术网

C# NHibernate查询缓存每行发出一个请求以获取实体

C# NHibernate查询缓存每行发出一个请求以获取实体,c#,.net,nhibernate,second-level-cache,C#,.net,Nhibernate,Second Level Cache,我正在试用NHibernate的二级缓存。使用此代码: return session.Query<Payment>() .Cacheable() .OrderByDescending(payment => payment.Created) .Skip((page - 1)*pageSize) .Take(pageSize).ToArray(); 如果返回100行,将执行其中的100行。也就是说,一个大的性能问题。如果只执行此查询会更好: sel

我正在试用NHibernate的二级缓存。使用此代码:

return session.Query<Payment>()
    .Cacheable()
    .OrderByDescending(payment => payment.Created)
    .Skip((page - 1)*pageSize)
    .Take(pageSize).ToArray();
如果返回100行,将执行其中的100行。也就是说,一个大的性能问题。如果只执行此查询会更好:

select ... from Payment where Id in (1,2,3)
缓存中不存在实体可能是因为未配置实体缓存、缓存大小有限或缓存中的实体已过期或已从缓存中删除

为了不被迫100%依赖实体缓存,是否可以更改NHibernate查询“缺失”实体数据的方式?

1)是否可以配置NHibernate(我使用FluentNHibernate自动映射)也缓存实体

是,可以将Nhibernate二级缓存配置为缓存实体。 提及

2) 为了不被迫100%依赖缓存,有可能改变NHibernate查询“缺失”实体数据的方式吗


您需要指定相同的缓存区域,以便“激活”与主实体相同的集合缓存规则。否则,它将只缓存主实体,如果主实体是从二级缓存加载的,它将再次获取集合

我不知道FluentNhibernate是否支持这一点,但您需要检查文档

看起来集合(Bag)支持.Cache(CacheMapping)


1。我设法使实体缓存使用FNH约定。但是它不会缓存整个实体,即使我使用了即时加载,相关表中的数据也不会连接。是,已启用查询缓存。并缓存查询。但是查询缓存只包含ID。要获取数据,他们将访问实体缓存或每行执行一次查询以获取数据。我找到了instance.cache.includeal(),但它似乎不起作用…您应该在集合声明中添加缓存。发布你的地图。啊,抱歉,没有看到这不是你正在使用的集合。然后,您应该在entitymapping上声明CacheRegion以进行支付
select ... from Payment where Id in (1,2,3)