Sitecore — удалить подэлементы корзины

У меня есть импортер элементов, который удаляет все элементы элементов и создает новые элементы. Недавно перешел на ведра и теперь проблема с удалением. Я удаляю элементы, используя:

myItem.DeleteChildren();

Без ведра это заняло около 20 минут. Теперь на 5к элементов уходит около 1 часа. Нужно ли возвращать элемент корзины перед удалением, а затем снова синхронизировать? Каков самый быстрый способ удалить разделяемые элементы?


person petros    schedule 04.04.2016    source источник


Ответы (4)


Вы могли бы сделать еще один шаг. Я смог импортировать 30 КБ за считанные минуты, отключив все три.

using (new Sitecore.SecurityModel.SecurityDisabler())
{
    using (new Sitecore.Data.Events.EventDisabler())
    {
        using (new ProxyDisabler())
        {
            //delete code here
        }
    }
}
person Chris Auer    schedule 04.04.2016
comment
Когда я добавляю подэлемент корзины, должен ли я использовать что-то отличное от метода myBucket.Add(), как обычно? Я добавил некоторые элементы и могу найти их в редакторе контента Sitecore. - person petros; 05.04.2016
comment
Просто добавьте элементы, как обычно, и они будут помещены в корзину. Если они не попадают в корзину автоматически, значит, в вашем шаблоне не задана корзина в стандартных значениях. - person Chris Auer; 05.04.2016

Я предполагаю, что ваше удаление теперь занимает больше времени, потому что ведро обновляет индексы при удалении. Хотя вы можете ускорить его, отключив события вокруг вашего вызова .DeleteChildren, вам все равно потребуется обновить эти индексы, чтобы ваша корзина работала правильно.

Итак, чтобы ответить на ваш вопрос, нет способа ускорить его, сохранив при этом полную функциональность.

Если вы хотите проверить это в действии, попробуйте следующее:

using(new EventDisabler()) myItem.DeleteChildren();

Это должно увеличить скорость удаления до прежнего уровня, но ценой корзины, которая не будет работать должным образом, пока не будут построены индексы.

Я бы порекомендовал вам адаптировать подход к интеграции, при котором полное удаление и перестроение вашего хранилища предметов не требуется.

person Mark Cassidy    schedule 04.04.2016
comment
да. Но он также должен наверстать упущенное самостоятельно. В конце концов. Просто знайте; что с момента импорта и обновления индекса все, что вы запрашиваете через API ведра, будет давать противоречивые/неправильные результаты. Для перестроения индекса: stackoverflow.com/questions/31419638/sitecore-refresh-index - person Mark Cassidy; 05.04.2016

Если у вас много элементов в ведре, он будет выполнять события для каждого удаляемого элемента. Поместите код удаления в блокировщик событий:

using (new EventDisabler())
{
   myItem.DeleteChildren();
}

Это предотвратит срабатывание всех событий и должно быть значительно быстрее. В качестве предостережения: при этом индексы не будут обновляться мгновенно, поэтому вы можете запустить обновление индекса в главной БД после запуска вашего импортера.

Другой вариант — обновить существующие элементы в импорте, а не сначала удалять все элементы.

person Richard Seal    schedule 04.04.2016

Может быть (программно) распаковать перед вызовом DeleteChildren()? Я не знаю, сколько времени это займет в общей сложности, но может быть быстрее, чем сейчас.

person Dražen Janjiček    schedule 26.04.2016