如何在 DbSet.Reremove 之后维护数据

本文关键字:之后 维护 数据 Reremove DbSet | 更新日期: 2023-09-27 18:32:27

我使用存储库模式,为了使事情集中化,我创建了一个IValidate接口,我的每个存储库都可以实现。在这种情况下,我根据其状态进行实体验证。到目前为止一切顺利,直到我删除了一个实体。当我尝试从已删除的实体访问属性时,我收到异常,该实体不再在上下文中。

前任:

class A
{
   int MyClassBId
   B MyClassB
}

如果我添加或更新实体A我可以轻松访问A.MyClassB。但是,如果我甚至在调用 SaveChanges 之前删除 (DbSet.Remove)(我的方法当然在保存之前称之为验证),则引用为空。因此,如果我尝试再次访问A.MyClassB,我会得到空引用,但"非延迟加载"对象在那里。例如,A.MyClassBId仍然有 FK 用于B .

我知道 DbSet.Remove 只标记了要删除的实体,没有别的。它是否也将其从上下文中删除?我该如何解决这个问题?调用 DbSet.Remove 并仍然维护对象中的引用,至少在调用 SaveChanges 之前?

谢谢。

如何在 DbSet.Reremove 之后维护数据

您必须了解正在进行两个过程:

    实体
  1. 框架跟踪加载在DbContext中的实体,维护它们的状态为AddedModifiedDeletedUnchanged。您可以通过MyDataContext.Entry(MyEntity).State电话进行检查。
  2. 从表面上看,POCO 类的行为就像您对与 ORM 没有任何连接的类所期望的那样。

因此,当您调用 DbSet.Remove 方法时,会发生什么情况是,该实体将在封面下标记为删除,并且从外部它也将从它所属的 ICollection 中删除。

如果要跟踪应在SaveChanges调用中删除的实体,则必须在实体上定义WillBeDeleted属性,并且代码在计算活动实体、验证等时必须考虑此属性。然后,应在呼叫SaveChanges之前进行实际的DbSet.Remove调用。

或者,您可以在初始化 DbContext 之前使用 MyDataContext.Configuration.AutoDetectChangesEnabled=False。现在,受 DbSet.Remove 方法约束的实体不会从其在 POCO 类中的ICollection中删除,但如果不再次在您自己的属性中跟踪它,您将无法知道该实体是否要被删除。