【问题标题】:LINQ to SQL returning old data after an updateLINQ to SQL 在更新后返回旧数据
【发布时间】:2012-02-18 03:29:47
【问题描述】:

我有一个使用 LINQ to SQL 连接数据库的应用程序。我无法让 LINQ to SQL 返回正确的新更新数据。

发生的事情是,我在 UI 上更改了一个字段,LINQ to SQL 生成更新语句,并将新数据存储在数据库中。但是,LINQ to SQL 之后一直返回旧数据,我必须停止并重新启动 IIS 才能获取新的更新数据。

更新

请注意,旧数据是从 LINQ to SQL 返回的。

有什么想法吗?

【问题讨论】:

  • 更新后您是否提交了更改?
  • @Adrian 如果重启应用时返回新数据,则必须保存数据。
  • 那么也许你正在缓存数据并且它返回缓存的值而不是新的值
  • 您正在使用的DataContext 的使用寿命是多少?听起来你可能会重复使用它for more than one "unit of work"
  • 或者,多个DataContexts 可能正在共享一个缓存。关闭对象跟踪可以提供帮助。请参阅“第二个 DataContext 未更新”here

标签: c# .net linq linq-to-sql linq-to-entities


【解决方案1】:

这听起来像是您正在使用某种缓存,也许是页面缓存?如果您检索更新数据的唯一方法是重新启动应用程序,那么您的数据必须依赖于应用程序的生命周期。

【讨论】:

  • 请注意旧数据是从 LINQ to SQL 返回的。
  • 你确定吗?您是否使用调试器单步执行代码以查看是否正在调用 LINQ to SQL?如果是这样,您能否发布返回陈旧数据的代码。
【解决方案2】:

由于 Linq to SQL 处理缓存的方式,有两种情况会导致奇怪的行为:

  1. 重复使用DataContextDataContext 旨在用于一个“工作单元”,其中“工作单元”本质上是让DataContext 存活的最短时间。请参阅MSDN page 上的备注部分。
  2. 多个DataContexts。它们将维护单独的缓存,因此使用 DataContext 所做的更改可能不会反映在从其他人检索的数据中。您可以通过设置ObjectTrackingEnabled 来关闭缓存,这将蛮力解决问题。否则,这里描述了一些管理并发DataContexts 的技术:How to: Manage Change Conflicts

【讨论】:

  • 第二点,多个datacontext应该都能有正确的数据。你能详细说明一下吗?
  • 没有任何深度;我并不是很了解所有细节。不过,我相信这只是标准的缓存/一致性难题:如果不对每个查询进行轮询,缓存就无法知道数据库中的数据是否已更改,这样做会破坏拥有缓存的目的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-17
  • 2017-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多