尽管配置了查询筛选器,但加载了 EF Core 导航 属性

EF Core Navigation Property is loaded although Query Filter is configured

我将 EF Core 5.0.4 与 MS SQL 服务器和延迟加载一起使用。 我的实体都来自 BaseEntity,其中包含一个 Deleted 属性。 对于所有实体,我配置了一个全局查询过滤器,它只允许加载 Deleted 设置为 false 的实体。 现在我有一个 Project 实体和一个 Appointment 实体和一个 n:m 实体 ProjectAppointment.

public class ProjectAppointment : BaseEntity
{
    public ProjectAppointment(Guid? id, Project project, Appointment appointment) : base(id)
    {
        Project = project;
        Appointment = appointment;
    }

    public ProjectAppointment(Guid? id, Guid projectId, Guid appointmentId) : base(id)
    {
        ProjectId = projectId;
        AppointmentId = appointmentId;
    }

    public ProjectAppointment()
    {
    }

    public Guid ProjectId { get; private set; }
    public virtual Project Project { get; private set; }
    public Guid AppointmentId { get; private set; }
    public virtual Appointment Appointment { get; private set; }
}

所有三种类型都派生自 BaseEntity。 如果我从包含最近更改为 Deleted = true 的项目约会的数据库加载约会,此导航 属性 仍将由 ef 核心返回,尽管查询过滤器应避免这种情况:

我创建了一个 simplified repository 来演示这个问题。它也会在没有延迟加载的情况下发生。

如何配置 entity framework 不使用 Deleted = true 延迟加载导航属性?

好的,我已经检查了你的样本。

您已加载记录、更新并尝试检查此记录是否出现在其他集合中。这里的问题是 ChangeTracker 已经知道这个记录并且知道它应该应用到哪个集合,即使它不是从数据库返回的。

解决方法:

  • _appContext.Entry(pa).State = EntityState.Detached;
    
  • _appContext.ChangeTracker.Clear();
    
  • 在一个 DbContext 中更新,在另一个中加载。