2

有没有办法在使用GetAllIncludingorInclude方法时自动激活“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>());
}
4

3 回答 3

2

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 没有可用于修改从包含生成的查询的钩子,至少这是我正在阅读的内容。

因此,这意味着您将需要进行自己的查询来解决此问题。您可以在以下链接中查看如何通过使用投影来过滤包含:

过滤包括 LINQ 和实体框架中的项目

于 2017-07-14T15:19:47.853 回答
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);

于 2019-11-27T07:25:29.917 回答
0

您可以使用我在 EF Core 1.x 的软删除中使用的技巧,或者使用 EF Core 2

如何使用“Entity Framework Core”(又名 EF7)实现“软删除”?

它将在包含期间过滤实体

于 2017-08-15T17:35:04.950 回答