如果我在不调用DbContext.SaveChanges的情况下调用DbContext.Dispose会怎么样?

时间:2017-04-20 13:55:10

标签: .net entity-framework entity-framework-6 dbcontext rollback

我正在寻找一种回滚实体更改的方法。我遇到了this answer,其中展示了如何设置实体状态,但我想知道如果我只是在不调用dbContext的情况下处理我的dbContext.SaveChanges()实例或操纵实体状态会发生什么。

我写的这样做的代码肯定有用,但是我是否通过这种方式拒绝改变而使任何东西处于不稳定状态?

3 个答案:

答案 0 :(得分:3)

调用实现Dispose()的类的IDisposable方法意味着您正在告诉图书馆"我已完成此对象。我将不再使用它。你可以根据需要清理。"这不是特定于实体框架。

对于大多数类,在调用Dispose()之后继续使用该对象的尝试将失败,有时会有一个显式异常提醒您该问题,有时是由于对象状态损坏导致的内部异常。您不应该假设Entity Framework是一个例外:在调用dbContext.Dispose()之后,您不应再使用dbContext引用的上下文。

但是,之后不会阻止您立即创建上下文:

dbContext.Dispose();
dbContext = new DbContext();

这个新上下文绝对不会记录您在旧上下文中所做的任何未保存的更改。有很多好的案例,这种方法最实用。

答案 1 :(得分:3)

  

如果我只是在不调用dbContext.SaveChanges()或操纵实体状态的情况下处理我的dbContext实例会发生什么?

无。以前附加到现在处理的DbContext实例的实例继续存在,因为任何普通实例都会假设某些地方的某些处理器上有句柄。如果没有内存将被释放并最终垃圾收集,因为任何其他正常的实例将无法处理它。内存中实体的状态保持不变,内存中的任何内容都不会自动恢复。数据库存储也保持“原样”,这意味着没有从DbContext到数据存储区的调用。

  

我是否以这种方式拒绝改变而使任何事情处于不稳定状态

不,至少不在数据存储中。在内存中很难说,它取决于代码中断的位置以及在此之前对修改的依赖性。让我们假设它是一个无状态的asp.net应用程序,也许请求只是结束,在这种情况下,任何以下任何请求都不会发生任何不稳定因为它们应该从数据存储中检索所需的任何内容。

如果它的某些东西比Windows应用程序更长久,那么您可能必须手动确保先前被跟踪的实例的任何指针/句柄都使用现在恢复的内存状态更新或释放这些指针。

就任何新的DbContext实例而言,它们都彼此独立运行,因此它们之间没有延续。新的DbContext不知道被跟踪的状态或任何其他DbContext实例跟踪的状态。

答案 2 :(得分:0)

没有什么会处于不稳定状态,所以不用担心。如果您在处理后尝试调用上下文,则会ObjectDisposedException,否则如果您不再需要它,则处置它是合法的。