果园核心级联删除
Orchard Core Cascade Delete
我创建了一个内容项“公司”,其中包含项目“要约”的列表部分。
当我删除 Company 时,它的所有 Offers 子项都不会被删除,并且以后也无法删除(可能在 DB 中手动进行,但这不是我想要实现的方式)。这些项目仍然可以在客户用户界面(Razor 页面)中访问。
以上所有操作均在 Orchard 管理面板中手动进行。我正在使用解耦 cms 模式。
是否有可能让 Orchard 对这些项目进行级联删除?
我刚刚准备了一些代码片段。也许这在您的上下文中是合适的。首先,您应该创建 ContentPartHandler 并将 ListPart 作为泛型类型并重写 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 class 的 ConfigureServices 方法中注册您的处理程序。
services.AddContentPart<ListPart>().AddHandler<MyListPartHandler>();
我创建了一个内容项“公司”,其中包含项目“要约”的列表部分。 当我删除 Company 时,它的所有 Offers 子项都不会被删除,并且以后也无法删除(可能在 DB 中手动进行,但这不是我想要实现的方式)。这些项目仍然可以在客户用户界面(Razor 页面)中访问。
以上所有操作均在 Orchard 管理面板中手动进行。我正在使用解耦 cms 模式。
是否有可能让 Orchard 对这些项目进行级联删除?
我刚刚准备了一些代码片段。也许这在您的上下文中是合适的。首先,您应该创建 ContentPartHandler 并将 ListPart 作为泛型类型并重写 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 class 的 ConfigureServices 方法中注册您的处理程序。
services.AddContentPart<ListPart>().AddHandler<MyListPartHandler>();