Linq to SQL Strange Caching?

时间:2009-05-31 13:39:37

标签: c# linq linq-to-sql

我有一个奇怪的(如果我错了,请纠正我)错误/功能与Linq to SQL令我困惑并试图了解正在发生的事情。

所以我在程序上采取了整个过程,希望找到一个解决方案,到目前为止还无法修复。

以下是对正在发生的事情的重复:

  1. 记录对数据库表“ETickets”所做的更改。从9更改了“可用性”列 到8(见下文) Change made to database http://www.composeandshoot.com/soverflow/changemadetodb.jpg

  2. 刷新具有ASP转发器数据绑定到ETickets表的页面。这仍显示“9”。

  3. 在数据绑定上查看quickwatch以查看从数据库返回的值(见下文): quickwatch http://www.composeandshoot.com/soverflow/linqtosqlquickwatch.jpg

  4. 然后我看了一下在SQL服务器上运行的查询。解雇了SQL Server Profiler并得到以下内容(见下文): SQL profiler http://www.composeandshoot.com/soverflow/linqquery.jpg

  5. 查询

    exec sp_executesql N'SELECT [t0]。[id],[t0]。[eventid],[t0]。[availability],[t0]。[cost] 来自[dbo]。[ETickets] AS [t0] WHERE [t0]。[id] = @ p0',N'@ p0 uniqueidentifier',@ p0 ='2642C0EF-C0C5-4881-9AC8-53C023B444D2'

  6. SQL Server返回“8”作为可用性!然而,数据绑定仍显示“9”。我没有启用任何SQL缓存依赖项。

  7. 请有人指点我在这方向吗?感谢。

2 个答案:

答案 0 :(得分:2)

数据上下文的生命周期是什么?它是相同的数据上下文,还是每次都是新的? (它可能应该是后者)。

如果您重新使用数据上下文,那么当它看起来具有相同的标识时,它必须始终返回相同的对象。因此,如果它之前已经为您提供了9版本,那么即使基础数据发生变化,它也会继续为您提供该参考。

此刻,这仍然是一次往返;为了避免往返,你需要使用:

var obj = ctx.SomeTable.Single(x=>x.Id == id);

即。如果它已在本地标识缓存中具有Id == id的对象,则它根本不会执行数据库查询。

任何其他构造都会进行往返。有一个fix in 4.0,以便.Where(x=>x.Id == id).Single()可以避免往返,这应该与查询语法有关,即

var obj = (from x in ctx.SomeTable
           where x.Id == id
           select x).Single();

答案 1 :(得分:1)

您是否使用一个DataContenxt进行更新,而后来查询的那个仍然存在?

如果是,这是你应该期待的回应。

如果您在更新或更新后创建了一个新的DataContenxt,并且正在对同一个DataContext进行读取,那么您应该得到正确的响应。