如何在DbSet.mmove之后维护数据?

时间:2014-11-27 23:22:18

标签: c# entity-framework entity-framework-6 repository-pattern

我使用存储库模式并使事物集中化我创建了一个IValidate接口,我的每个存储库都可以实现。在那里,我根据他们的状态进行实体验证。到目前为止一直很好,直到我删除了一个实体。当我尝试从被删除的实体访问属性时,我得到了一个例外,该实体不再处于上下文中。

例如:

class A
{
   int MyClassBId
   B MyClassB
}

如果我添加或更新实体A,我可以毫无困难地访问A.MyClassB。但是,如果我在调用SaveChanges之前删除(DbSet.Remove)(我的方法当然在保存之前调用此Validations),引用为null。因此,如果我再次尝试访问A.MyClassB,我会得到空引用,但是"不是懒惰的"对象在那里。例如,A.MyClassBId仍然具有B的FK。

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

感谢。

1 个答案:

答案 0 :(得分:1)

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

  1. 实体框架会跟踪DbContext中加载的实体,并将其状态保持为AddedModifiedDeletedUnchanged。您可以通过MyDataContext.Entry(MyEntity).State电话进行检查。
  2. 从表面上看,POCO类的行为与您对ORM无任何关联的类的期望一样。
  3. 那么当您调用DbSet.Remove方法时会发生什么情况,实体将被标记为在封面下删除,并且外部它将从它所属的ICollection中删除。

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

    或者,您可以在初始化DbContext之前使用MyDataContext.Configuration.AutoDetectChangesEnabled=False。现在,受DbSet.Remove方法约束的实体将不会从POCO类中的ICollection中删除,但您无法知道该实体是否会被删除而不再在属于你自己的财产。