尽管配置了查询筛选器,但加载了 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
中更新,在另一个中加载。
我将 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
中更新,在另一个中加载。