2

我想知道我是否误解了 L2 缓存的工作原理。我正在尝试缓存“HasMany(x => x.Posts)”,基本上我有一个主题下有很多帖子 - 我的印象是,如果我在主题地图的顶部添加以下内容

Cache.ReadWrite().IncludeAll();

它的缓存映射和 hasManys 直到重新启动应用程序的基础数据更改?我的 L2 缓存配置如下

Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2008.ConnectionString(c => c.FromConnectionStringWithKey("MyAppConString")))
.Cache(c => c.ProviderClass<SysCacheProvider>().UseQueryCache())
.Mappings(m => m.FluentMappings.AddFromAssemblyOf<MembershipUserMap>())
Etc…etc..

在我的主题图中,我有以下内容(我删除了一些法线贴图以缩短它),您可以在帖子上看到 HasMany。

    public TopicMap()
    {
        Cache.ReadWrite().IncludeAll();

        Id(x => x.Id);
        Map(x => x.Name);
        *lots of other normal maps*

        References(x => x.Category).Column("Category_Id");
        References(x => x.User).Column("MembershipUser_Id");
        References(x => x.LastPost).Column("Post_Id").Nullable();

        HasMany(x => x.Posts)
            .Cascade.AllDeleteOrphan().KeyColumn("Topic_Id")
            .Inverse();

    *And a few other HasManys*
    }

因此,如果我抓住所有主题,请循环并执行以下操作

Topic.Posts.Count()

使用 SqlProfiler 我看到获取每个主题的所有帖子(第一次命中),但如果我重新加载页面,我仍然看到所有获取主题查询的帖子?

我错过了什么吗?我认为这应该现在被缓存?

4

1 回答 1

0

Ayende一篇很好的帖子,解释了你遇到的同样的问题。

基本上,您所拥有的只是缓存帖子的 ID,而不是帖子本身。请注意,您已经为实体启用了缓存Topic,但您可能没有PostPostMap.

Cache.ReadWrite()PostMap

请注意,如果您使用即时加载,NHibernate 在大多数情况下将无法正确进行集合缓存Fetch.Join(),就像您在其他问题中所遇到的那样。

这是对缓存的一个很好的概述,以及您在急切加载集合时可能遇到的问题。

于 2012-07-03T22:22:20.377 回答