如果我调用 DbContext.Dispose 而不调用 DbContext.SaveChanges 会怎样?

osc*_*tin 3 .net entity-framework rollback dbcontext entity-framework-6

我正在寻找一种回滚实体更改的方法。我遇到了这个答案,它显示了如何设置实体状态,但我想知道如果我只是处理我的dbContext实例而不调用dbContext.SaveChanges()或操作实体状态会发生什么。

我为此编写的代码肯定有效,但是我是否会通过这种方式拒绝更改而使任何内容处于不稳定状态?

Igo*_*gor 5

如果我只是处理 dbContext 实例而不调用 dbContext.SaveChanges() 或操作实体状态,会发生什么

没有什么。之前附加到现在已处置实例的实例DbContext将继续存在,因为任何普通实例都会假设在某处有对这些实例的句柄。如果没有,内存将被释放,并最终被垃圾收集,就像没有句柄的任何其他正常实例一样。内存中实体的状态保持原样,内存中的任何内容都不会自动恢复。数据库存储也保持“原样”,这意味着没有从 DbContext 到数据存储的调用。

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

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

如果它像 Windows 应用程序一样寿命更长,那么您可能必须手动确保之前跟踪的实例的任何指针/句柄要么使用现在恢复的内存状态进行更新,要么释放这些指针。

就任何新的 DbContext 实例而言,它们都是相互独立运行的,因此它们之间没有连续性。新的 DbContext 不知道正在跟踪的状态或任何其他 DbContext 实例已跟踪的状态。