EF Core HasQueryFilter on Include()

4
我有点困惑于HasQueryFilter方法是否适用于通过Include()方法连接的实体。
从这篇(旧的)文章中,他们陈述了以下内容:https://blogs.msdn.microsoft.com/dotnet/2017/05/12/announcing-ef-core-2-0-preview-1/

当查询直接检索特定类型的数据以及通过导航属性(例如使用Include()方法)检索数据时,过滤器会自动应用。

我在我的DbContext类中有以下内容:
protected override void OnModelCreating(ModelBuilder builder)
{
    builder.Entity<Post>().HasQueryFilter(x => x.Removed == null);
}

如果我执行以下操作,则它还会检索所有Posts记录,其中Removed不为null
// Doesn't apply the query filter because of the Include()
var blog = _dbContext.Blogs.Include(x => x.Posts).Where(x => x.Id == 100);

如果我直接查询 Post,那么 HasQuerFilter 会发挥作用。
// Here query filter works, because of query directly on Entity
var posts = _dbContext.Posts.ToList();

所以,这个功能在使用 Include() 连接的实体上还不能正常工作吗?或者我有什么遗漏吗?


1
我无法重现这个问题(使用 ef-core 2.1.4)。我的查询过滤器在类似的环境中可以正常工作。 - Gert Arnold
@GertArnold 我正在使用InMemory提供程序进行单元测试。不确定这是否会有所不同? - Vivendi
1
@GertArnold 找到问题了。我在测试中只使用了一个 using 语句来创建 dbContext,而不是像文档中所示的两个。显然,您必须有一个 using 语句来添加数据到 dbContext,然后使用另一个 using 语句来查询。现在这样做可以正常工作了。 - Vivendi
是的,全局过滤器不会从上下文中“分离”实体。 - Gert Arnold
1
抱歉@Vivendi,我遇到了同样的问题,但我不理解你所评论的解决方案。你能再详细解释一下吗?这将非常有帮助。谢谢。 - Marisol Gutiérrez
显示剩余2条评论
1个回答

0

这是一个跟踪问题(这就是为什么多个 using 语句可以工作的原因)。

不过有多种解决方法:

请参见 如何清除实体框架中的跟踪实体

我们使用了以下代码: _dbContext.Entry(blog).State = EntityState.Detached;


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接