如果我调用 DbContext.Dispose 而没有调用 DbContext.SaveChanges 会怎样?
What if I call DbContext.Dispose without calling DbContext.SaveChanges?
我正在寻找回滚实体更改的方法。我遇到了 this answer,它展示了如何设置实体状态,但我想知道如果我简单地处理我的 dbContext
实例而不调用 dbContext.SaveChanges()
或操纵实体状态会发生什么。
我为此编写的代码确实有效,但我是否通过这种方式拒绝更改而使任何东西处于不稳定状态?
调用 class 实现 IDisposable
的 Dispose()
方法意味着您在告诉库 "I am done with this object. I will no longer use it. You may clear up as needed." 这不是特定于 Entity Framework。
对于大多数 classes,尝试在调用 Dispose()
后继续使用该对象将失败,有时会出现一个明确的异常提醒您该问题,有时是由损坏的对象引起的内部异常状态。你不应该假设 Entity Framework 是一个例外:在调用 dbContext.Dispose()
之后,你不应该再使用 dbContext
.
引用的上下文
但是,没有什么可以阻止您随后立即创建 new 上下文:
dbContext.Dispose();
dbContext = new DbContext();
这个新上下文绝对不会记得您在旧上下文中所做的任何未保存的更改。有很多好的案例,这种方法最实用。
没有什么会处于不稳定状态,所以不用担心。如果您在处置后尝试调用上下文,您将得到 ObjectDisposedException
否则,如果您不再需要它,处置它是合法的。
what happens if I simply dispose of my dbContext instance without calling dbContext.SaveChanges() or manipulating the entity states
没有。先前附加到现在处置的 DbContext
实例的实例继续存在,因为任何普通实例都会假设这些实例在某处有句柄。如果没有,内存将被释放并最终被垃圾收集,就像没有句柄的任何其他正常实例一样。内存中实体的状态保持原样,内存中的任何内容都不会自动恢复。数据库存储也保持 "as is",这意味着没有从 DbContext 到数据存储的调用。
am I leaving anything in an unstable state by rejecting changes in this way
不,至少不在数据存储中。在内存中很难说,这取决于代码停止的位置以及在那之前对修改的依赖性。让我们假设它是一个无状态的 asp.net 应用程序,也许请求只是结束,在这种情况下,以下任何请求都不会发生不稳定,因为它们应该从数据存储中检索所需的任何内容。
如果它的生命周期更长,例如 windows 应用程序,那么您可能必须手动确保任何 pointers/handles 之前被跟踪的实例都更新为现在恢复的 -内存状态或释放那些指针。
就任何新的 DbContext 实例而言,它们都是彼此独立运行的,因此它们之间没有连续性。新的 DbContext 不知道正在跟踪的状态或已被任何其他 DbContext 实例跟踪的状态。
我正在寻找回滚实体更改的方法。我遇到了 this answer,它展示了如何设置实体状态,但我想知道如果我简单地处理我的 dbContext
实例而不调用 dbContext.SaveChanges()
或操纵实体状态会发生什么。
我为此编写的代码确实有效,但我是否通过这种方式拒绝更改而使任何东西处于不稳定状态?
调用 class 实现 IDisposable
的 Dispose()
方法意味着您在告诉库 "I am done with this object. I will no longer use it. You may clear up as needed." 这不是特定于 Entity Framework。
对于大多数 classes,尝试在调用 Dispose()
后继续使用该对象将失败,有时会出现一个明确的异常提醒您该问题,有时是由损坏的对象引起的内部异常状态。你不应该假设 Entity Framework 是一个例外:在调用 dbContext.Dispose()
之后,你不应该再使用 dbContext
.
但是,没有什么可以阻止您随后立即创建 new 上下文:
dbContext.Dispose();
dbContext = new DbContext();
这个新上下文绝对不会记得您在旧上下文中所做的任何未保存的更改。有很多好的案例,这种方法最实用。
没有什么会处于不稳定状态,所以不用担心。如果您在处置后尝试调用上下文,您将得到 ObjectDisposedException
否则,如果您不再需要它,处置它是合法的。
what happens if I simply dispose of my dbContext instance without calling dbContext.SaveChanges() or manipulating the entity states
没有。先前附加到现在处置的 DbContext
实例的实例继续存在,因为任何普通实例都会假设这些实例在某处有句柄。如果没有,内存将被释放并最终被垃圾收集,就像没有句柄的任何其他正常实例一样。内存中实体的状态保持原样,内存中的任何内容都不会自动恢复。数据库存储也保持 "as is",这意味着没有从 DbContext 到数据存储的调用。
am I leaving anything in an unstable state by rejecting changes in this way
不,至少不在数据存储中。在内存中很难说,这取决于代码停止的位置以及在那之前对修改的依赖性。让我们假设它是一个无状态的 asp.net 应用程序,也许请求只是结束,在这种情况下,以下任何请求都不会发生不稳定,因为它们应该从数据存储中检索所需的任何内容。
如果它的生命周期更长,例如 windows 应用程序,那么您可能必须手动确保任何 pointers/handles 之前被跟踪的实例都更新为现在恢复的 -内存状态或释放那些指针。
就任何新的 DbContext 实例而言,它们都是彼此独立运行的,因此它们之间没有连续性。新的 DbContext 不知道正在跟踪的状态或已被任何其他 DbContext 实例跟踪的状态。