【问题标题】:How do I delete content item with all parts in Orchard?如何在 Orchard 中删除包含所有部分的内容项?
【发布时间】:2014-10-21 11:53:08
【问题描述】:

我是 Orchard CMS 和 C# 开发的新手。我正在尝试创建自己的新闻模块。 该模块将一些 MenuItem 注入到 AdminMenu 中,并提供管理站点新闻的功能。 我创建了一个NewsItem 文档类型,它由TitlePartBodyPart 和我自己的NewsPart 组成。

NewsPart 基于NewsPartRecord,其中包含两个额外的字符串字段SourceTitleSourceUrl

我面临无法完全删除我的内容项的问题。 ContentManager.Remove(id) 只是将项目版本标记为latest = false 并隐藏它。但我不需要为我的文档项目存储旧版本和任何备份。它就像数据库中的垃圾。

在我的NewsPartHandler 中使用OnRemove 事件仅影响newsPartRecord 表,其他部分如TitlePartBodyPart 和项目数据和版本仍然存在于数据库中。

如何完全删除ContentItem 数据?

【问题讨论】:

    标签: c# orchardcms orchardcms-1.8


    【解决方案1】:

    你不知道:Orchard 只进行软删除。这样您就可以取消删除并恢复到以前的版本。从技术上讲,清理已删除项目的数据库是可行的,但据我所知,没有人愿意这样做。

    【讨论】:

    • 感谢您的回答!我阅读了有关软删除的信息,但对我来说这似乎很奇怪,因为它会导致数据库中出现一些垃圾。在学习 Orchard 一周后,整个概念对我来说似乎过于复杂,并且看起来它是为最终用户设计的,而不是为开发人员设计的。
    • 它会导致实际问题吗?
    • 这取决于网站的类型,在某些情况下可能会。
    • 我不同意这一点。 Orchard 是 IMO 为开发人员设计的,而不是为最终用户设计的。
    • 虽然我也认为应该存在硬删除,尤其是删除真正旧的数据或甚至不再存在的内容类型的数据。
    【解决方案2】:

    基于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()

    【讨论】:

      【解决方案3】:

      改用IContentManager.Delete() 并实现IContentHandler,它会覆盖Destroyed() 以删除像零件数据这样的依赖关系。这应该可以解决问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-21
        • 1970-01-01
        相关资源
        最近更新 更多