ASP.NET nHibernate每请求缓存

ASP.NET nHibernate每请求缓存,asp.net,nhibernate,caching,Asp.net,Nhibernate,Caching,可以启用从请求开始到请求结束的缓存 对于某些表,启用不多次选择同一记录的缓存将非常有用 例如,当我多次渲染一个局部时,不需要在局部中选择 假设这个片段: @foreach(var row in orders) { @{Html.RenderPartial("Order");} } 偏序为: <div> @session.Query<Langs>.SingleOrDefault(el => el.Id == "EN')

可以启用从请求开始到请求结束的缓存

对于某些表,启用不多次选择同一记录的缓存将非常有用

例如,当我多次渲染一个局部时,不需要在局部中选择

假设这个片段:

@foreach(var row in orders)
    {
        @{Html.RenderPartial("Order");}
    }
偏序为:

<div>
        @session.Query<Langs>.SingleOrDefault(el => el.Id == "EN').Description
    </div>
<div>
    @Model.OrderID
</div>

@session.Query.SingleOrDefault(el=>el.Id==“EN”)。说明
@Model.OrderID
是否可以启用仅在当前会话中缓存“Langs”表的缓存

没有缓存,每个请求我有N个(订单数)选择,否则使用请求缓存,每个请求我将有1个选择


谢谢!

您至少有两种可能性:

  • 缓存查询
  • 在对象Langs映射上启用缓存
查询:

 @session.Query<Langs>.SetCacheable(true).SingleOrDefault(el => el.Id == "EN').Description
@session.Query.SetCacheable(true).SingleOrDefault(el=>el.Id==“EN”)。说明

并将键hibernate.cache.use_query_cache=true添加到配置中

您不应该从任何视图(如您提到的部分视图)中执行任何数据库查询。这几乎总是导致选择N+1方案

遵循MVC模式,不要混淆关注点。任何数据库查询都应该从存储库层启动,然后填充表示视图所需数据的模型对象,然后将该模型传递给视图

通过编程,任何事情都是可能的,而且总是有无数种方法来做同样的事情,但遵循最佳实践和关注点分离将使您摆脱自我,并帮助您构建高效、可扩展和可维护的应用程序


重申一下,无论视图需要访问什么数据,都要在MVC模式的控制器端执行所有这些查询。以任何其他方式做都会混淆顾虑,并导致类似您所遇到的情况。

但是。。。nHibernate 2°级缓存是应用程序/会话缓存还是请求缓存?