Nope, but I can testify that this cache worked, when I wrote it :) On Fri, May 8, 2009 at 00:57, Jonathan Pryor <[email protected]> wrote:
> I think QueryCache is broken. I'm quite confused about the whole thing, > actually... > > What I'm trying to do is "port" NerdDinner to Mono/Linux. In an ideal > world, nothing would need to change, but this isn't an ideal world (as I'm > finding plenty of issues in Mono's System.Data.Linq i.e. DbLinq to keep me > less than happy, e.g. the .Count() issue I asked about a few days ago). > > So what I'm seeing happen is this: the url e.g. > http://localhost:8080/Dinners/Details/1 contains detail information about > the dinner with ID 1. Simple enough. The problem is after I hit this URL, > if I go to *any other* dinner detail page (e.g. > http://localhost:8080/Dinners/Details/2), I get the information for the * > first* page I visited. > > This is, of course, incredibly annoying. > > What makes me think QueryCache is the problem is that if I change > QueryCache.GetFromSelectCache() to always return null (i.e. kill the > cache), everything Just Works. > > So I'm quite sure that QueryCache is the problem. What I'm not sure about > is why I can't reproduce this in the unit tests (which is *really*annoying). > > What I do know is that when I view the log output, the generated queries > have the wrong values. For example, my annotated log output: > > # Went to: http://localhost:8080/Dinners/Details/1 > <http://localhost:8080/Dinners/Details/3> > # Getting Dinner: 1 > SELECT TOP (2) [DinnerID], [Title], [EventDate], [Description], [HostedBy], > [ContactPhone], [Address], [Country], [Latitude], [Longitude] > FROM [dbo].[Dinners] > WHERE [DinnerID] = @id > -- @id: Input Int32 (Size = 4; Prec = 0; Scale = 0) [1] > -- Context: SqlServer Model: AttributedMetaModel Build: 3.5.0.0 > # Got Dinner: 1 > > # Now, within DinnerRepository.GetDinner(), I sanity check with: > # id = 3; > # var a = db.Dinners.Single(d => d.DinnerID == id); > # id = 4; > # var b = db.Dinners.Single(d => d.DinnerID == id); > # Console.Error.WriteLine("# a='{0}'; b='{1}'", a.DinnerID, > b.DinnerID); > # Sanity check output... > SELECT TOP (2) [DinnerID], [Title], [EventDate], [Description], [HostedBy], > [ContactPhone], [Address], [Country], [Latitude], [Longitude] > FROM [dbo].[Dinners] > WHERE [DinnerID] = @id > -- @id: Input Int32 (Size = 4; Prec = 0; Scale = 0) [3] > -- Context: SqlServer Model: AttributedMetaModel Build: 3.5.0.0 > SELECT TOP (2) [DinnerID], [Title], [EventDate], [Description], [HostedBy], > [ContactPhone], [Address], [Country], [Latitude], [Longitude] > FROM [dbo].[Dinners] > WHERE [DinnerID] = @id > -- @id: Input Int32 (Size = 4; Prec = 0; Scale = 0) [4] > -- Context: SqlServer Model: AttributedMetaModel Build: 3.5.0.0 > # a='3'; b='4' > # OK, sanity check is sane. > > # At this point, things are sane. > > # Went to: http://localhost:8080/Dinners/Details/2 > <http://localhost:8080/Dinners/Details/3> > # Getting Dinner: 2 > SELECT TOP (2) [DinnerID], [Title], [EventDate], [Description], [HostedBy], > [ContactPhone], [Address], [Country], [Latitude], [Longitude] > FROM [dbo].[Dinners] > WHERE [DinnerID] = @id > -- @id: Input Int32 (Size = 4; Prec = 0; Scale = 0) [4] > -- Context: SqlServer Model: AttributedMetaModel Build: 3.5.0.0 > # Got Dinner: 4 > # Sanity check... > SELECT TOP (2) [DinnerID], [Title], [EventDate], [Description], [HostedBy], > [ContactPhone], [Address], [Country], [Latitude], [Longitude] > FROM [dbo].[Dinners] > WHERE [DinnerID] = @id > -- @id: Input Int32 (Size = 4; Prec = 0; Scale = 0) [4] > -- Context: SqlServer Model: AttributedMetaModel Build: 3.5.0.0 > SELECT TOP (2) [DinnerID], [Title], [EventDate], [Description], [HostedBy], > [ContactPhone], [Address], [Country], [Latitude], [Longitude] > FROM [dbo].[Dinners] > WHERE [DinnerID] = @id > -- @id: Input Int32 (Size = 4; Prec = 0; Scale = 0) [4] > -- Context: SqlServer Model: AttributedMetaModel Build: 3.5.0.0 > # a='4'; b='4' > > # Uh, wtf? Notice that even though we're going to 2, > # we see [4] in the output. Furthermore, my > # NerdDinner.GetDinner() sanity check is also returning > # the *same* Dinner, even though it shouldn't. > > # Went to: http://localhost:8080/Dinners/Details/3 > # Getting Dinner: 3 > SELECT TOP (2) [DinnerID], [Title], [EventDate], [Description], [HostedBy], > [ContactPhone], [Address], [Country], [Latitude], [Longitude] > FROM [dbo].[Dinners] > WHERE [DinnerID] = @id > -- @id: Input Int32 (Size = 4; Prec = 0; Scale = 0) [4] > -- Context: SqlServer Model: AttributedMetaModel Build: 3.5.0.0 > # Got Dinner: 4 > SELECT TOP (2) [DinnerID], [Title], [EventDate], [Description], [HostedBy], > [ContactPhone], [Address], [Country], [Latitude], [Longitude] > FROM [dbo].[Dinners] > WHERE [DinnerID] = @id > -- @id: Input Int32 (Size = 4; Prec = 0; Scale = 0) [4] > -- Context: SqlServer Model: AttributedMetaModel Build: 3.5.0.0 > SELECT TOP (2) [DinnerID], [Title], [EventDate], [Description], [HostedBy], > [ContactPhone], [Address], [Country], [Latitude], [Longitude] > FROM [dbo].[Dinners] > WHERE [DinnerID] = @id > -- @id: Input Int32 (Size = 4; Prec = 0; Scale = 0) [4] > -- Context: SqlServer Model: AttributedMetaModel Build: 3.5.0.0 > # a='4'; b='4' > > # and things are still hosed. > > I'm largely clueless here, not being nearly familiar enough with the > code. All I'm *sure* of is that killing the query cache makes things > work. > > My *suspicion* is that SelectQuery is actually at fault, as > SelectQuerycontains the input parameters ( > SelectQuery.InputParameters), which are used ~directly in the resulting > SQL query (see SelectQuery.GetCommand(), which adds each input Parameterto > Command.Parameters, and uses parameter.GetValue() to obtain the actual > value. So it *appears* that SelectQuery is not only caching the query > itself, but the parameters used with the query as well, which is absolutely > *bad*. > > But if this were truly the case, then this would be visible in the unit > tests (e.g. ReadTest.A5_SelectSingleOrDefault()), and I'm not seeing it in > the unit tests. > > Thoughts? (Or better, actual fixes?) > > - Jon > > > > > > > --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "DbLinq" group. To post to this group, send email to [email protected] To unsubscribe from this group, send email to [email protected] For more options, visit this group at http://groups.google.com/group/dblinq?hl=en -~----------~----~----~----~------~----~------~--~---
