使用GetAllIncluding
或Include
方法时,有没有办法自动激活“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>());
}
答案 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生成的查询的钩子,至少是我正在阅读的内容。
所以,所有这些意味着您将需要自己的查询来解决这个问题。您可以通过以下链接中的投影来了解如何过滤包含:
答案 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);