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
-~----------~----~----~----~------~----~------~--~---

Reply via email to