In order for the entity to be saved, you need to commit the tx. In the test,
you should probably purge the 2nd level cache by evicting the serialized
entity.
sessionFactory.Evict(typeof(Foo));

will remove all serialized Foo objects from the 2nd level cache. To evict
only one:

sessionFactory.Evict(typeof(Foo), id);

James
--
James Kovacs, B.Sc., M.Sc., MCSD, MCT
Microsoft MVP - C# Architecture
http://www.jameskovacs.com
[EMAIL PROTECTED]
403-397-3177 (mobile)


On Mon, Sep 8, 2008 at 6:04 PM, Craig Neuwirt <[EMAIL PROTECTED]> wrote:

> Ayende,
>
>   Thanks for the feedback.  However, I believe the Saving operation is
> polluting the test.  I want my test to demonstrate the ability to execute a
> query against EXISTING data in the database and have that query put in the
> query cache so that the next time I execute the same query, it uses the
> cache instead of hitting the db.
>
> So to test this, a Foo needs to be in the db and this part needs to be
> removed
>  using (ISession s = OpenSession())
>     using (ITransaction tx = s.BeginTransaction())
>     {
>         s.Save(foo);
>         tx.Commit();
>     }
> Isn't this the normal way of using the query cache?
>
> thanks.
>  craig
> On Mon, Sep 8, 2008 at 3:07 PM, Ayende Rahien <[EMAIL PROTECTED]> wrote:
>
>> Blah!
>> We were looking at the wrong spot all along.
>> This test works, I marked the parts that I had to change.
>>
>> Perfectly obvious, when you think of this.
>> You asked NHibernate to create new foo, so it has to put it in the cache
>> and invalidate all Foos until the transaction is commited.
>> It does so by specifying a timeout value of one minute from now (IIRC),
>> which obivously mixes up with the test timing.
>>
>> When the tx is commited, NH can make this visible again, and set it to the
>> current timestamp.
>>
>>
>> [Test]
>> public void DoesNotLoadEntityFromSysCache()
>> {
>>     Foo foo = new Foo();
>>     foo.Name = "Craig";
>>
>>     using (ISession s = OpenSession())
>>     using (ITransaction tx = s.BeginTransaction())
>>     {
>>         s.Save(foo);
>>         tx.Commit();
>>     }
>>
>>     using (ISession s = OpenSession())
>>     using( ITransaction tx = s.BeginTransaction())
>>     {
>>         Foo result = (Foo)s.CreateCriteria(typeof(Foo))
>>             .Add(Property.ForName("Name").Eq("Craig"))
>>             .SetCacheable(true)
>>             .UniqueResult();
>>
>>         Assert.IsNotNull(result);
>>         tx.Commit();
>>     }
>>
>>     using (ISession s = OpenSession())
>>     {
>>         using (IDbCommand command = s.Connection.CreateCommand())
>>         {
>>             command.CommandText = "DELETE FROM Foos";
>>             command.ExecuteNonQuery();
>>         }
>>     }
>>
>>     using (ISession s = OpenSession())
>>     using (ITransaction tx = s.BeginTransaction())
>>     {
>>         Foo result = (Foo)s.CreateCriteria(typeof(Foo))
>>             .Add(Property.ForName("Name").Eq("Craig"))
>>             .SetCacheable(true)
>>             .UniqueResult();
>>
>>         Assert.IsNotNull(result);
>>
>>         tx.Commit();
>>     }
>>
>>     using (ISession s = OpenSession())
>>     using (ITransaction tx = s.BeginTransaction())
>>     {
>>         s.Delete("from Foo");
>>         s.Flush();
>>
>>         tx.Commit();
>>
>>     }
>> }
>>
>> On Mon, Sep 8, 2008 at 10:47 PM, Craig Neuwirt <[EMAIL PROTECTED]>wrote:
>>
>>> Yeah, that's what I eluded to on my first post.
>>>
>>> Thanks for letting me know I am not completely crazy yet ;-)
>>>
>>>
>>> On Mon, Sep 8, 2008 at 1:28 PM, Ayende Rahien <[EMAIL PROTECTED]> wrote:
>>>
>>>> I think there is still something funny going on, looks to be related to
>>>> the time stamps that were going on there.
>>>>
>>>>
>>>>
>>>> On Mon, Sep 8, 2008 at 9:20 PM, James Kovacs <[EMAIL PROTECTED]>wrote:
>>>>
>>>>> I modified your patch to use transactions and SysCache worked for me as
>>>>> expected. I even debugged through and looked at the contents of the Foos
>>>>> table to verify that the IDbCommand did in fact delete the row. I've since
>>>>> reverted the code, but can re-create it tonight when I get home.
>>>>>  James
>>>>> --
>>>>> James Kovacs, B.Sc., M.Sc., MCSD, MCT
>>>>> Microsoft MVP - C# Architecture
>>>>> http://www.jameskovacs.com
>>>>> [EMAIL PROTECTED]
>>>>> 403-397-3177 (mobile)
>>>>>
>>>>>
>>>>>   On Mon, Sep 8, 2008 at 12:16 PM, Craig Neuwirt <[EMAIL PROTECTED]>wrote:
>>>>>
>>>>>> So, was their actually a determination made whether or not SysCache is
>>>>>> working as expected or there is actually a problem.  If it is the former,
>>>>>> can someone please show me how to make it work (you can make updates the
>>>>>> patch I submitted)
>>>>>>
>>>>>> thanks,
>>>>>>   craig
>>>>>>
>>>>>>
>>>>>> On Sun, Sep 7, 2008 at 7:02 PM, Ayende Rahien <[EMAIL PROTECTED]>wrote:
>>>>>>
>>>>>>> You have to commit the transaction.
>>>>>>> NH requires transactions for reads as well.
>>>>>>>
>>>>>>>
>>>>>>> On Mon, Sep 8, 2008 at 2:53 AM, Craig Neuwirt <[EMAIL PROTECTED]>wrote:
>>>>>>>
>>>>>>>> Hey James,
>>>>>>>>
>>>>>>>>   You are absolutely correct.  Once I added the transaction, my unit
>>>>>>>> test passed.  However, the actual scenario I am trying to get working 
>>>>>>>> is
>>>>>>>> assuming data is in the db already and I perform an initial query.  I 
>>>>>>>> want
>>>>>>>> that result to go into the second level cache so it is retrieved from 
>>>>>>>> the
>>>>>>>> cache when the same query is executed.  How do I make that happen?  I 
>>>>>>>> tried
>>>>>>>> putting transaction around the query, but that didn't work and I don't 
>>>>>>>> think
>>>>>>>> that should be necessary for reads.
>>>>>>>>
>>>>>>>> thanks,
>>>>>>>> craig
>>>>>>>>
>>>>>>>>
>>>>>>>> On Sun, Sep 7, 2008 at 5:14 PM, James Kovacs <
>>>>>>>> [EMAIL PROTECTED]> wrote:
>>>>>>>>
>>>>>>>>> I am looking at it right now. Initial investigations... The problem
>>>>>>>>> seems to stem from lack of transaction handling in the test case. If 
>>>>>>>>> rather
>>>>>>>>> than flushing the session, you commit a transaction, the SysCache 
>>>>>>>>> returns
>>>>>>>>> data appropriately. I'll post more as I find out more. (Just posting 
>>>>>>>>> to save
>>>>>>>>> Ayende some time.)
>>>>>>>>>
>>>>>>>>> James
>>>>>>>>> --
>>>>>>>>> James Kovacs, B.Sc., M.Sc., MCSD, MCT
>>>>>>>>> Microsoft MVP - C# Architecture
>>>>>>>>> http://www.jameskovacs.com
>>>>>>>>> [EMAIL PROTECTED]
>>>>>>>>> 403-397-3177 (mobile)
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> On Sun, Sep 7, 2008 at 4:07 PM, Ayende Rahien <[EMAIL 
>>>>>>>>> PROTECTED]>wrote:
>>>>>>>>>
>>>>>>>>>> Guys,
>>>>>>>>>> I am going to look at the issue now, will post my results soon
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> On Sun, Sep 7, 2008 at 10:44 PM, Gildas <[EMAIL PROTECTED]>wrote:
>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>> Fabio, I know that I'm still noob in NHibernate and that I may
>>>>>>>>>>> ask
>>>>>>>>>>> stupid questions. I'm sorry if you are bored with this, but well,
>>>>>>>>>>> please understand that I'm just trying to resolve a problem I did
>>>>>>>>>>> not
>>>>>>>>>>> have before upgrading to last NHibernate trunk.
>>>>>>>>>>>
>>>>>>>>>>> Going through Rhino code, I can see that my session is created at
>>>>>>>>>>> each
>>>>>>>>>>> request, so that's not the problem.
>>>>>>>>>>> Anyway, I still don't have any second level cache. Items are
>>>>>>>>>>> updated
>>>>>>>>>>> but never retrieved from it.
>>>>>>>>>>>
>>>>>>>>>>> Can someone check the test case from craig, which is failing and
>>>>>>>>>>> don't
>>>>>>>>>>> use any fancy session management ?
>>>>>>>>>>>
>>>>>>>>>>> Thanks
>>>>>>>>>>>
>>>>>>>>>>> On Sep 7, 8:35 pm, "Fabio Maulo" <[EMAIL PROTECTED]> wrote:
>>>>>>>>>>> > 2008/9/7 Gildas <[EMAIL PROTECTED]>
>>>>>>>>>>>  >
>>>>>>>>>>> >
>>>>>>>>>>> >
>>>>>>>>>>> > > So I'm going to ask if this is the right way to handle
>>>>>>>>>>> sessions ? From
>>>>>>>>>>> > > what I remember of NHibernate, NH Sessions must not be stored
>>>>>>>>>>> in
>>>>>>>>>>> > > HttpContext.Session. I may not understand the reasons why
>>>>>>>>>>> this done
>>>>>>>>>>> > > like this in UnitOfWorkApplication, maybe for long
>>>>>>>>>>> transactions
>>>>>>>>>>> > > management ?
>>>>>>>>>>> >
>>>>>>>>>>> > Rhino UoW use httpSession only for long conversation...
>>>>>>>>>>> > The NhSession CAN be stored in the httpSession simply because
>>>>>>>>>>> is the "most
>>>>>>>>>>> > simple" way to manage long-conversations.
>>>>>>>>>>> > --
>>>>>>>>>>> > Fabio Maulo
>>>>>>>>>>>
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>
>>>>>>
>>>>>>
>>>>>
>>>>>
>>>>>
>>>>
>>>>
>>>>
>>>
>>>
>>>
>>   >>
>>

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"nhusers" 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/nhusers?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to