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 # 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 # 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 SelectQuery contains the input parameters (SelectQuery.InputParameters), which are used ~directly in the resulting SQL query (see SelectQuery.GetCommand(), which adds each input Parameter to 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 -~----------~----~----~----~------~----~------~--~---
