C# 如何在DbSet.Remove之后维护数据?

C# 如何在DbSet.Remove之后维护数据?,c#,entity-framework,entity-framework-6,repository-pattern,C#,Entity Framework,Entity Framework 6,Repository Pattern,我使用存储库模式,为了使事情集中化,我创建了一个IValidate接口,我的每个存储库都可以实现。我根据实体的状态进行实体验证。到目前为止还不错,直到我删除了一个实体。当我试图从一个被删除的实体访问一个属性时,我得到了一个异常,该实体不再在上下文中 例: 如果我添加或更新实体A,我可以轻松访问A.MyClassB。但是,如果我甚至在调用SaveChanges之前就删除(DbSet.Remove)(我的方法当然会在保存之前调用这个验证),那么引用是空的。因此,如果我再次尝试访问A.MyClassB

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

例:

如果我添加或更新实体
A
,我可以轻松访问
A.MyClassB
。但是,如果我甚至在调用SaveChanges之前就删除(DbSet.Remove)(我的方法当然会在保存之前调用这个验证),那么引用是空的。因此,如果我再次尝试访问
A.MyClassB
,我会得到null引用,但“notlazy-loaded”对象就在那里。例如,
A.MyClassBId
仍然具有
B
的FK

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


谢谢。

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

  • 实体框架跟踪加载到
    DbContext
    中的实体,并将其状态保持为
    已添加
    已修改
    已删除
    未更改
    。您可以通过调用
    MyDataContext.Entry(MyEntity.State)来检查这一点
  • 从表面上看,POCO类的行为与您对与ORM没有任何连接的类的预期一样
  • 因此,当您调用DbSet.Remove方法时,实体将在封面下标记为删除,从外观上看,它也将从它所属的ICollection中删除

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


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

    我考虑过在每个POCO类中添加属性的方法,但这似乎有点贵。我错了吗?关于第二个建议,如果我设置我还需要额外的属性,我不想阻止EF跟踪更改。等待你的答复。感谢您的回答。如果新的
    WillBeDeleted
    属性将其放入数据库,那么这只会有点昂贵,这是不必要的。您可以通过将属性注释为
    来防止这种情况。在对实体进行每次枚举或计数时,必须考虑到
    WillBeDeleted
    属性,这会带来成本。我至少没有找到解决方法,因此不得不修复许多错误,但我们已经实现了它。关于阻止EF跟踪更改:这在许多情况下都是一个很好的主意,因为它可以提高性能,但我同意默认情况下禁用它是不明智的。好吧,Dabblernl,我同意这一点。。。如果您不介意的话,我需要对我的代码执行一些不需要的更改:d再次感谢。
    class A
    {
       int MyClassBId
       B MyClassB
    }