2

オブジェクトにエンティティ キャッシュ (第 2 レベルのキャッシュ) を使用しています。ここで、ある特定のクエリ (私は OueryOver を使用) で、第 2 レベルのキャッシュを回避する必要があります。クエリで「キャッシュ可能」属性を省略しようとしましたが、クエリはまだキャッシュされています。

私のランタイム:

.NET 4.0 NHibernate: 3.1.0.4000 Fluent NHibernate: 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 を使用できます。この場合、2 番目のレベルのキャッシュをスキップするため機能しますが、推奨される解決策ですか?

4

1 に答える 1

3

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 の呼び出しは既にリストを返すため、冗長に思えます...

于 2012-09-17T13:39:28.593 に答える