我使用存储库模式并使事物集中化我创建了一个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之前?
感谢。
答案 0 :(得分:1)
您必须了解正在进行两个过程:
DbContext
中加载的实体,并将其状态保持为Added
,Modified
,Deleted
或Unchanged
。您可以通过MyDataContext.Entry(MyEntity).State
电话进行检查。那么当您调用DbSet.Remove方法时会发生什么情况,实体将被标记为在封面下删除,并且外部它将从它所属的ICollection中删除。
如果您想跟踪SaveChanges
来电时应删除的实体,则必须在实体上定义WillBeDeleted
属性,并且您的代码必须考虑此属性计算活动实体,验证等。然后应在调用DbSet.Remove
之前进行实际的SaveChanges
调用。
或者,您可以在初始化DbContext之前使用MyDataContext.Configuration.AutoDetectChangesEnabled=False
。现在,受DbSet.Remove
方法约束的实体将不会从POCO类中的ICollection
中删除,但您无法知道该实体是否会被删除而不再在属于你自己的财产。