DbContext的内部缓存(?)

Dar*_*mak 11 entity-framework-4

我创建了自己的上下文,它继承自DbContext.假设我在数据库的[Posts]表中有1个帖子.考虑这种情况:

  1. 第一次问DbContext这个帖子.并且DbContext按预期返回它.
  2. 手动更改[Posts]表中的一列.
  3. 我刷新我的网站=我再次询问DbContext这篇文章.
  4. DbContext返回一个具有此特定列的旧值的帖子!

每次刷新我的网站时,我都会查看SQL事件探查器和数据库IS,那么为什么返回的帖子有旧值?我猜DbContext试图变得非常聪明并且有一些内部缓存机制,但很高兴告诉我他很聪明......

谁可以给我解释一下这个?

Gre*_*reg 0

你如何“清爽”?如果您知道某个值已更改,则可以使用 ServerWins 或 ClientWins 刷新上下文缓存的值:

http://msdn.microsoft.com/en-us/library/vstudio/bb738618(v=vs.100).aspx

// Resolve the concurrency conflict by refreshing the 
// object context before re-saving changes. 
context.Refresh(RefreshMode.ClientWins, orders);
Run Code Online (Sandbox Code Playgroud)

然而,真正的问题归根结底是什么时候以及为什么会发生这种情况,这与上下文的生命周期有关。也许您可能过度使用相同的上下文?请记住,SQL Server 等都有自己的缓存机制,因此实体框架并不是尝试进行缓存的项目池中唯一的鱼。

我们从以下链接收集了一些提示,如果您遵循这些提示,您可能不会遇到此问题。 http://msdn.microsoft.com/en-us/data/jj729737.aspx

  • 当您加载更多对象时,上下文的内存消耗可能会迅速增加
  • 随着生命周期的延长,遇到并发相关问题的可能性也会增加
  • 使用 Web 应用程序时,每个请求使用一个上下文实例
  • 使用 Windows 窗体时,为每个窗体使用一个上下文