4

我有两个对象 - ContentPage,其中有一个集合ChildLinks

ContentPage
-----------
ID
Title

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

ContentPage.ChildLinks属性使用二级缓存。我正在使用 Fluent NH 来配置 Nhibernate,并使用 Nhibernate 3.1。缓存设置为集合和“ChildLink”类的“读写”。

我注意到,每当我删除 aChildLink时,集合缓存都不会失效。因此,当我调用 时ContentPage.ChildLinks,我得到一个错误:

no row with the given identifier exists

我已经关闭了缓存,它运行良好。缓存不应该自动失效吗?我使用 SysCache 作为缓存提供程序,使用 MySQL 作为数据库。

提前致谢!

4

1 回答 1

2

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

逆映射集合和 NHibernate 的二级缓存

基本上,如果您已将集合映射为inverse,则在删除子项时,您还必须确保将其从父集合中显式删除,否则在删除子项后缓存状态将无效。首先要检查的是关系是否真的需要反向。

假设 inverse 是必要的或期望的,并使用您的示例:

而不仅仅是这样的:

Session.Delete(ChildLink);

你所要做的:

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

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

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

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);
于 2012-03-01T07:51:10.580 回答