如何获取NHibernate ISession以缓存主键未检索到的实体

如何获取NHibernate ISession以缓存主键未检索到的实体,nhibernate,caching,isession,Nhibernate,Caching,Isession,我的“用户”实体几乎总是通过用户名检索,而不是通过其整数代理键检索。因为用户名不是主键,这意味着ISession不会缓存它,而是重复访问数据库以获取相同的数据 是否有任何方法可以配置NHibernate以获得ISession以缓存通过用户名检索的用户?是的,您可以使用NHibernate的自然id元素来完成此操作。你看,这个例子正是你想要的。看起来答案实际上是否定的。如果你使用的是二级缓存,那么答案是肯定的。如果你使用的是会话缓存,那么答案是否定的。会话缓存实际上不是缓存,而是实体映射 我的建议

我的“用户”实体几乎总是通过用户名检索,而不是通过其整数代理键检索。因为用户名不是主键,这意味着ISession不会缓存它,而是重复访问数据库以获取相同的数据


是否有任何方法可以配置NHibernate以获得ISession以缓存通过用户名检索的用户?

是的,您可以使用NHibernate的自然id元素来完成此操作。你看,这个例子正是你想要的。

看起来答案实际上是否定的。如果你使用的是二级缓存,那么答案是肯定的。如果你使用的是会话缓存,那么答案是否定的。

会话缓存实际上不是缓存,而是实体映射


我的建议是,使用在HttpContext中存储项的自定义提供程序为查询启用二级缓存。

事实上,自然id元素本身是不够的;你必须启用二级缓存。这是我担心的。我不想使用二级缓存。我对每个请求使用会话,我不希望缓存的项目持续时间超过这个时间。我想我的问题的答案是否定的。在什么意义上它不是一个缓存?它存储从数据库中加载的实体,并且不再需要随后从数据库中加载这些实体。那是我来的地方!感谢您对基于HttpContext的缓存提供程序的建议。该问题的答案是否定的,但可以使用Sergi Papaseit对该问题的回答来解决该问题: