流畅的nHibernate L2缓存不适用于HasMany项目

时间:2012-07-03 17:54:37

标签: nhibernate fluent-nhibernate nhibernate-mapping

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

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我看到每个主题的获取所有帖子(第一次点击),但如果我重新加载页面,我仍然会看到主题查询的所有帖子?

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

1 个答案:

答案 0 :(得分:0)

Ayende a good post解释了您遇到的同样问题。

基本上,你所拥有的只是缓存帖子的ID,而不是帖子本身。请注意,您已为Topic个实体启用了缓存,但您可能对Post中的PostMap个实体执行了相同操作。

同时将Cache.ReadWrite()添加到PostMap

请注意,如果您使用Fetch.Join()的急切加载,NHibernate将无法在大多数情况下执行收集缓存,就像您在other question中一样。

以下是缓存的a very good overview以及您在热切加载集合时可能遇到的问题。