Sitecore在添加项时会添加多个孤立项

4
在我的Sitecore 6.1.0安装中,我通过实现自己的自定义处理程序来挂接“item:added”事件,方法如下(在Web.config中):
   <event name="item:added">
    <handler type="Sitecore.Data.Fields.ItemEventHandler, Sitecore.Kernel" method="OnItemAdded" />
    <handler type="my.project.Classes.OnSaveItemHandler, my.project" method="OnItemAdded" />
   </event>

这是为了强制要求项目具有唯一名称 - 换句话说,在我的OnItemAdded方法中,我想要通过Lucene搜索查找与正在添加的项目具有相同名称的任何其他项目。每当在Sitecore结构中添加项目时,都会调用OnItemAdded方法。但我的问题是 - 该方法对于每个项目被调用多次。根据我添加项目的Sitecore结构位置不同,它被调用的次数在6到26之间变化。我的OnItemAdded方法主体为空:
    protected void OnItemAdded(object obj, EventArgs args)
    {
    }

当添加一个项目时,第一次调用该方法时,args参数中的项目是正确的。如果项目名称为theItemName,则FullPath属性将如下所示:

/sitecore/content/theItemName

除了第一个之外,每次该项目看起来都是正确的,但该项目的路径看起来像这样:

[orphan]/sitecore/content/theItemName

为什么会在完整路径上添加[孤儿]位?为什么即使我只添加一个项目,OnItemAdded方法也会被调用多次?

很奇怪。也许可以在support.sitecore.net上创建一个工单。 - marto
3个回答

4
我相信这种事件存在已知问题,其中该方法将被调用多次。我有过类似的经历,当我尝试在创建项目时编程创建项目角色时,发生了这种情况。John West在此处提供了以下预防措施

我记得Sitecore有时会多次触发某些事件,所以你可能需要检查一下[...]

然后John提供了一个名为“使用Sitecore拦截项目更新”的博客链接。

在我的代码中,我有一个检查,检查我正在寻找的操作是否已经发生,例如项目角色是否存在。在你的情况下,在该方法中进行检查可能会更加困难。也许你可以做一些诡计,比如:

protected void OnItemAdded(object obj, EventArgs args) {
  Item item = // code to extract item from args, I forgot it

  if(item.Paths.FullPath.StartsWith("/sitecore/content")) {
    // do your stuff because you know its the first time the event fired
  }
}

再次强调,这种方法非常不规范。如果Sitecore支持团队无法提供更好的解决方案(或者在Stack Overflow上没有更好的解决方案),我才会考虑使用这种方法。


0

0

我也遇到了同样的问题,看起来这个问题与代理项有关。

我会添加一个项目,然后得到很多这些[孤立]路径,每个创建的项目都有不同的id。

关闭代理项可以阻止创建[孤立]项目。

编辑 - 发现Shadows表已经损坏, 在主数据库中截断了Shadows表,并在核心中截断了Links数据库,然后重建了链接数据库。 我得到了46个这样的孤立记录,而这些记录上本来就没有设置代理项。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接