Как удалить элемент контента со всеми частями в Orchard?

Я новичок в разработке Orchard CMS и C#. Я пытаюсь создать свой собственный модуль новостей. Модуль вводит несколько элементов меню в AdminMenu и предоставляет функциональные возможности для управления новостями сайта. Я создал тип документа NewsItem, который состоит из TitlePart, BodyPart и моего собственного NewsPart.

NewsPart основан на NewsPartRecord, который содержит 2 дополнительных строковых поля SourceTitle и SourceUrl.

Я столкнулся с проблемой, что не могу полностью удалить элементы своего контента. ContentManager.Remove(id) просто помечает версию элемента как latest = false и скрывает ее. Но мне не нужно хранить старые версии и какие-либо резервные копии элементов моих документов. Это как мусор в БД.

Использование события OnRemove в моем NewsPartHandler влияет только на таблицу newsPartRecord, а другие части, такие как TitlePart, BodyPart, а также данные и версии элементов, все еще присутствуют в базе данных.

Как полностью удалить данные ContentItem?


person teran    schedule 21.10.2014    source источник


Ответы (3)


Вы этого не сделаете: Orchard выполняет только обратимое удаление. Таким образом, вы можете восстановить и вернуться к предыдущим версиям. Технически возможно очистить базу данных от удаленных элементов, но, насколько мне известно, никто не удосужился это сделать.

person Bertrand Le Roy    schedule 21.10.2014
comment
спасибо за Ваш ответ! Я читал про мягкие удаления, но мне это кажется странным, так как это приводит к некоторому мусору в БД. после недели изучения Orchard вся концепция кажется мне чрезмерно сложной и выглядит так, как будто она предназначена для конечных пользователей, а не для разработчиков. - person teran; 21.10.2014
comment
Вызывает ли это реальную проблему? - person Bertrand Le Roy; 22.10.2014
comment
это зависит от типа сайта, в некоторых случаях может быть. - person teran; 22.10.2014
comment
Я не согласен с этим. Orchard IMO разработан для разработчиков, а не для конечных пользователей. - person devqon; 22.10.2014
comment
Хотя я тоже считаю, что аппаратное удаление должно существовать, особенно для удаления действительно старых данных или данных типов контента, которых больше не существует. - person devqon; 22.10.2014
comment
@teran: можно поконкретнее? что это будет за проблема? - person Bertrand Le Roy; 23.10.2014
comment
@BertrandLeRoy предположим, что есть система, в которой у нас есть тысячи входящих документов в день, и по некоторым причинам мы должны удалить половину из них. то через несколько лет у нас есть миллионы записей мусора в БД. Если нам нужно обрабатывать данные в БД (строить отчеты или что-то в этом роде), это снизит скорость. но на самом деле в таких проектах надо выбирать другие инструменты, а не сад. - person teran; 23.10.2014
comment
@devqon Я сказал, что не для разработчиков, потому что в пользовательских модулях много кода для отображения вашего списка документов, вы должны реализовать контроллеры для списка, создания, редактирования, удаления документов. это выглядит очень странно для меня. Я думаю, Orchard должен сделать все это за меня, а я должен только описать структуру документа и шаблоны. В случае, если мне нужно собственное представление списка документов, я должен переопределить это, но не писать каждый раз. - person teran; 23.10.2014
comment
Это предположение, с ваших слов. Вы в такой ситуации? - person Bertrand Le Roy; 26.10.2014
comment
Хотя это оффтоп, я не могу не согласиться с @devqon. Во всяком случае, Orchard в первую очередь предназначен для разработчиков. - person Nathan; 17.01.2016

Основываясь на ответе ViRuSTriNiTy, этот обработчик уничтожит любой элемент контента и все записи его части, когда любой из них будет удален:

public class PermanentRemoveContentHandler : ContentHandler
{
    private readonly IOrchardServices _orchardServices;

    public PermanentDeleteContentHandler(IOrchardServices orchardServices)
    {
        this._orchardServices = orchardServices;
    }

    protected override void Removed(RemoveContentContext context)
    {
        this._orchardServices.ContentManager.Destroy(context.ContentItem);
    }
}

Обратите внимание, что для пользовательского кода вы можете вызвать IContentManager.Destroy() вместо обычного IContentManager.Remove(), когда хотите явно удалить все.

person Maxime Rossini    schedule 26.08.2016

Вместо этого используйте IContentManager.Delete() и реализуйте IContentHandler, который переопределяет Destroyed() для удаления зависимостей, таких как данные детали. Это должно сработать.

person ViRuSTriNiTy    schedule 19.02.2016