【问题标题】:Orchard Core Cascade Delete果园核心级联删除
【发布时间】:2020-06-23 11:33:07
【问题描述】:

我创建了一个内容项目“公司”,其中列出了项目“报价”的一部分。 当我删除公司时,它的所有优惠子项都不会被删除,以后也没有办法去做(可能在数据库中手动操作,但这不是我想要实现的方式)。这些项目仍可在客户用户界面(Razor 页面)中访问。

以上所有操作都在 Orchard 管理面板中手动完成。我正在使用解耦的 cms 模式。

是否有可能让 Orchard 对这些项目进行级联删除?

【问题讨论】:

    标签: orchardcms orchardcore


    【解决方案1】:

    我刚刚准备了一些代码片段。也许这在您的情况下是合适的。首先,您应该使用 ListPart 作为泛型类型创建 ContentPartHandler 并覆盖 RemoveAsync 方法。然后您可以获取所有列表项并将其删除(如下例所示)。

    public class MyListPartHandler : ContentPartHandler<ListPart>
    {
        private readonly IOrchardHelper _orchardHelper;
        private readonly IServiceProvider _serviceProvider;
    
        public MyListPartHandler(IOrchardHelper orchardHelper, IServiceProvider serviceProvider)
        {
            _orchardHelper = orchardHelper;
            _serviceProvider = serviceProvider;
        }
    
        public override async Task RemovedAsync(RemoveContentContext context, ListPart instance)
        {
            var items = await _orchardHelper.QueryListItemsAsync(instance.ContentItem.ContentItemId);
            var contentManager = _serviceProvider.GetService<IContentManager>();
            var tasks = items.Select(item => contentManager.RemoveAsync(item));
            await Task.WhenAll(tasks);
        }
    }
    

    最后,您应该在 Startup 类的 ConfigureServices 方法中注册您的处理程序。

    services.AddContentPart<ListPart>().AddHandler<MyListPartHandler>();
    

    【讨论】:

    • 这很好,但你不能像这样在 YesSql.Session(或内容管理器会话)上使用 Task.WhenAll,这样不是线程安全的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-12
    • 2021-08-22
    • 2022-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多