缓存集合没有被Nhibernate无效

时间:2011-09-09 18:19:20

标签: nhibernate caching collections invalidation

我有两个对象 - 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作为数据库。

提前致谢!

1 个答案:

答案 0 :(得分:2)

我遇到了同样的问题,我可以通过以下文章解决我的问题:

Inverse Mapped Collections and NHibernate's Second-Level Cache

基本上,如果您已将集合映射为反向,则在删除子项时,还必须确保从父集合中明确删除它,否则删除后缓存状态将无效孩子要检查的第一件事是关系真的需要反过来。

假设反转是必要或需要,并使用您的示例:

而不仅仅是:

Session.Delete(ChildLink);

你必须这样做:

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

此时您可能还需要显式保存您的ContentPage对象,这取决于您的会话刷新设置。

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

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);