【问题标题】:EF Core Navigation Property is loaded although Query Filter is configured尽管配置了查询过滤器,但已加载 EF Core 导航属性
【发布时间】:2021-06-20 13:21:39
【问题描述】:

我使用带有 MS SQL Server 和延迟加载的 EF Core 5.0.4。 我的实体都来自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 的 projectAppointment 的数据库中加载约会,则 ef core 仍将返回此导航属性,尽管查询过滤器应避免这种情况:

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

如何将实体框架配置为不使用Deleted = true 延迟加载导航属性?

【问题讨论】:

  • 在没有延迟加载的情况下如何工作?
  • @SvyatoslavDanyliv 不幸的是,关闭延迟加载模式不是该项目的选项
  • 我明白这一点。只要确保这在没有延迟加载的情况下工作。如果可行 - 在 EF Core github 存储库中创建一个问题。否则,您在选项配置中会遇到一些问题,您在原始问题中省略了这些问题。
  • 我将创建一个小项目来测试它,并让您知道结果
  • @SvyatoslavDanyliv 请在原帖中找到github存储库的链接

标签: c# entity-framework-core ef-code-first lazy-loading global-query-filter


【解决方案1】:

嗯,我已经检查了你的样品。

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

解决方法:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 2018-02-03
    • 2021-03-31
    • 1970-01-01
    • 2023-03-21
    相关资源
    最近更新 更多