包含集合时激活SoftDelete数据过滤器

时间:2017-07-13 13:53:44

标签: c# aspnetboilerplate

使用GetAllIncludingInclude方法时,有没有办法自动激活“IsSoftDelete”EF Core过滤器?

public override Task<PublicationDto> Get(EntityDto<Guid> input)
{
    var entity = Repository
                .GetAllIncluding(x => x.SocialPosts)
                .FirstOrDefault(x => x.Id == input.Id);
     return Task.FromResult(entity.MapTo<PublicationDto>());
}

3 个答案:

答案 0 :(得分:1)

ABP的EFCore版本不会自动过滤除查询的根实体之外的任何内容。如果查看AbpRepositoryBase中的实现,ApplyFilters只会查看查询所基于的实体,而不是查看包含的实体。

if (typeof(ISoftDelete).GetTypeInfo().IsAssignableFrom(typeof(TEntity)))
{
    if (UnitOfWorkManager?.Current == null || UnitOfWorkManager.Current.IsFilterEnabled(AbpDataFilters.SoftDelete))
    {
        query = query.Where(e => !((ISoftDelete)e).IsDeleted);
    }
}

在EF的常规实现中(使用EF v6.x),他们使用DynamicFilters nuget包为它们处理这个问题,但是这个插件对于EF Core来说并不存在。这实际上是EF Core的限制,比ABP更多。 EF Core没有可用于修改从Include生成的查询的钩子,至少是我正在阅读的内容。

所以,所有这些意味着您将需要自己的查询来解决这个问题。您可以通过以下链接中的投影来了解如何过滤包含:

Filtering include items in LINQ and Entity Framework

答案 1 :(得分:0)

你可以使用我用于EF Core 1.x的软删除技巧,或者使用EF core 2

How can I implement "Soft Deletes" with "Entity Framework Core" (aka EF7)?

它将在包含

期间过滤实体

答案 2 :(得分:0)

我来晚了。但是现在有一个叫做“ QueryFilter”的查询。 有关详细信息:

https://docs.microsoft.com/en-us/ef/core/querying/filters

https://www.meziantou.net/entity-framework-core-soft-delete-using-query-filters.htm

https://spin.atomicobject.com/2019/01/29/entity-framework-core-soft-delete/

MyModel将被过滤,即使它是一个包含的对象

    builder.Entity<MyModel>().HasQueryFilter(m => EF.Property<bool>(m, "isDeleted") == false);