【问题标题】:cached collection not being invalidated by NhibernateNhibernate 不会使缓存的集合失效
【发布时间】:2011-09-09 18:19:20
【问题描述】:

我有两个对象 - 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 的信息吗?用我自己的二级缓存查看 FNH(到 AppFabric)。

标签: nhibernate caching collections invalidation


【解决方案1】:

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

Inverse Mapped Collections and NHibernate's Second-Level Cache

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

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

而不仅仅是这样的:

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

【讨论】:

  • 我会对此进行调查并回复您,但它看起来很有趣。下周我得去看看,因为下周我要出国了!
猜你喜欢
  • 2011-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-17
  • 2011-01-13
  • 2017-09-08
  • 1970-01-01
相关资源
最近更新 更多