如何让 NHibernate ISession 缓存主键未检索到的实体
Posted
技术标签:
【中文标题】如何让 NHibernate ISession 缓存主键未检索到的实体【英文标题】:How to get NHibernate ISession to cache entity not retrieved by primary key 【发布时间】:2011-07-08 17:31:46 【问题描述】:我的“用户”实体几乎总是通过用户名检索,而不是通过其整数代理键。因为用户名不是主键,这意味着ISession不会缓存它,重复命中数据库,获取相同的数据。
有什么方法可以配置 NHibernate 来让 ISession 缓存通过用户名检索到的用户?
【问题讨论】:
【参考方案1】:似乎答案实际上是否定的。是的,如果您使用的是二级缓存,则如果您使用的是会话缓存,则不是。
【讨论】:
问题的答案是否定的,但是可以使用 Sergi Papaseit 对这个问题的回答来解决问题:***.com/questions/5272094/…【参考方案2】:是的,您可以使用 NHibernate 的 natural-id 元素来完成此操作。请参阅http://ayende.com/Blog/archive/2009/06/23/nhibernate-ltnatural-idgt.aspx,该示例正是您所要求的。
【讨论】:
其实自然id元素本身是不够的;您必须启用二级缓存。 这就是我所担心的。我不想使用二级缓存。我使用 Session-Per-Request,并且我不希望缓存的项目持续更长的时间。我认为我的问题的答案是否定的。【参考方案3】:“会话缓存”其实不是缓存,而是实体映射。
我的建议是您使用在 HttpContext 中存储项目的自定义提供程序为查询启用二级缓存。
【讨论】:
在什么意义上它不是缓存?它存储从数据库加载的实体,并且无需随后从数据库加载它们。那是我来自的缓存!感谢您对基于 HttpContext 的缓存提供程序的建议。以上是关于如何让 NHibernate ISession 缓存主键未检索到的实体的主要内容,如果未能解决你的问题,请参考以下文章
当 CacheMode=Ignore 时,为啥 NHibernate.ISession.CreateQuery 会返回与 CreateSQLQuery 不同的东西?
在每个请求使用会话时如何让 NHibernate 重试死锁事务?