Nhibernate未使缓存集合失效

4
我有两个对象 - ContentPage 和它所拥有的一个ChildLinks集合。
ContentPage
-----------
ID
Title

ChildLink
----------
ID
ParentPageID [ContentPage]
ChildPageID [ContentPage]
Priority

ContentPage.ChildLinks属性利用了二级缓存。我正在使用Fluent NH配置Nhibernate,同时使用Nhibernate 3.1。对于集合和“ChildLink”类,缓存都被设置为“读-写”。

我注意到每当我删除一个ChildLink时,集合缓存没有被无效化。因此,当我调用ContentPage.ChildLinks时,会出现错误:

no row with the given identifier exists

我已经关闭了缓存,现在很正常。难道缓存不应该自动失效吗?我使用的是 SysCache 作为缓存提供程序,MySQL 作为数据库。

非常感谢提前!


你能找到更多关于这个Karl的信息吗?我自己正在研究使用第二级缓存(到AppFabric)的FNH。 - Nick Ryan
1个回答

2
我有相同的问题,我找到了以下文章解决了我的问题:Inverse Mapped Collections and NHibernate's Second-Level Cache。基本上,如果您将集合映射为反向,当您删除子项时,还必须确保将其明确从父集合中移除,否则在删除子节点后缓存状态将无效。首先要检查的是关系是否真的需要是反向的。假设需要或希望使用反向关系,并使用您的示例:而不仅仅是:
Session.Delete(ChildLink);

您需要完成以下任务:

ContentPage.ChildLinks.Remove(ChildLink);
ChildLink.ParentPage = null;
Session.Delete(ChildLink);

在这一点上,您可能还需要明确保存您的ContentPage对象,这取决于您的Session flush设置。

我使用实体上的方法来管理这种反向关系,例如:

public ChildLink
{
    public ContentPage ParentPage {get;set;}

    public void AddToPage(ContentPage addTo)
    {
        addTo.ChildLinks.Add(this);
        this.ParentPage = addTo;
    }

    public void RemoveFromPage()
    {
        ParentPage.ChildLinks.Remove(this);
        this.ParentPage = null;
    }

}

当删除一个子对象时:

ChildLink.RemoveFromPage();
Session.Delete(ChildLink);

我会调查一下这个并回复你,但它看起来很有趣。下周我会出国,所以必须在接下来的一周内检查它! - Karl Cassar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接