我有两个对象 – 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);