2014-10-21 2 views
2

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

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

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

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

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

ответ

3

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

+0

благодарит за ваш ответ! Я читал о мягких ударах, но мне кажется странным, поскольку это приводит к мусору в БД. после недели обучения Orchard вся концепция кажется мне сложной, и выглядит так, как будто она предназначена для конечных пользователей, а не для разработчиков. – teran

+0

Вызывает ли это настоящая проблема? –

+1

зависит от типа сайта, в некоторых случаях может быть. – teran

0

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

0

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

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() когда это вы хотите явно удалить все.