gpt4 book ai didi

nhibernate - 如何在查询中跳过二级缓存?

转载 作者:行者123 更新时间:2023-12-04 05:32:00 25 4
gpt4 key购买 nike

我对一个对象使用实体缓存(二级缓存)。现在,在一个特定的查询中(我使用 OueryOver),我需要避开二级缓存。我试图在我的查询中省略“Cacheable”属性,但查询仍然被缓存,通过我假设的二级缓存。

我的运行时:

.NET 4.0
NHibernate:3.1.0.4000
流畅的 NHiberante:1.2.0.712

我的对象:

[Serializable]
public class ArticleWishListItem : EntityBase<int>
{
public virtual int CustomerId { get; set; }
public virtual int ArticleId { get; set; }
public virtual DateTime CreatedDate { get; set; }
}

我的映射:
public class ArticleWishListItemMapping : ClassMap<ArticleWishListItem>
{
public ArticleWishListItemMapping()
{
Cache.ReadWrite().Region("WishList");

Id(a => a.Id).GeneratedBy.Native();

Map(a => a.ArticleId).Not.Nullable();
Map(a => a.CreatedDate).Not.Nullable();
Map(a => a.CustomerId).Not.Nullable();
}
}

我的查询结果与我的愿望相反:
    private static List<ArticleWishListItem> GetArticleWishListItemsImplementation(NHibernate.ISession session, int customerId)
{
return session.QueryOver<ArticleWishListItem>()
.Where(a => a.CustomerId == customerId)
.List<ArticleWishListItem>()
.ToList<ArticleWishListItem>();
}

即使我想为实体启用缓存,每次都使此查询命中数据库的最佳方法是什么?我可以使用 IStatelessSession 并且它可以在这种情况下工作,因为它跳过二级缓存,但它是推荐的解决方案吗?

最佳答案

您需要使用 CacheMode.Ignore(只会在发生更新时使缓存失效)、CacheMode.Refresh(将刷新缓存中的所有项目并忽略 use_minimal_puts)或 CacheMode.Put(将刷新缓存中无效的任何项目我认为)。对枚举值的注释告诉您它们做得更好一些。

例如:

return session.QueryOver<ArticleWishListItem>()
.Where(a => a.CustomerId == customerId)
.CacheMode(CacheMode.Refresh)
.List<ArticleWishListItem>();

我不确定你为什么再次调用 .ToList - 这对我来说似乎是多余的,因为调用 .List 将返回一个列表......

关于nhibernate - 如何在查询中跳过二级缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12456774/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com