【发布时间】:2020-06-23 11:33:07
【问题描述】:
我创建了一个内容项目“公司”,其中列出了项目“报价”的一部分。 当我删除公司时,它的所有优惠子项都不会被删除,以后也没有办法去做(可能在数据库中手动操作,但这不是我想要实现的方式)。这些项目仍可在客户用户界面(Razor 页面)中访问。
以上所有操作都在 Orchard 管理面板中手动完成。我正在使用解耦的 cms 模式。
是否有可能让 Orchard 对这些项目进行级联删除?
【问题讨论】:
我创建了一个内容项目“公司”,其中列出了项目“报价”的一部分。 当我删除公司时,它的所有优惠子项都不会被删除,以后也没有办法去做(可能在数据库中手动操作,但这不是我想要实现的方式)。这些项目仍可在客户用户界面(Razor 页面)中访问。
以上所有操作都在 Orchard 管理面板中手动完成。我正在使用解耦的 cms 模式。
是否有可能让 Orchard 对这些项目进行级联删除?
【问题讨论】:
我刚刚准备了一些代码片段。也许这在您的情况下是合适的。首先,您应该使用 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>();
【讨论】: