缓存集合没有被Nhibernate无效

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

提前致谢!

最佳答案 我有同样的问题,我可以通过以下文章解决我的问题:

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