Interesting.  I dug through the ActiveRecord code and the OnLoad
method ties into NHibernate's IInterceptor.OnLoad.  This method is
called *before* the data returned from the database is used to
populate the entity.  In fact, the method comment states:

/// <summary>
/// Hook to transform the read data
/// from the database before populating
/// the object instance
/// </summary>

So that is why your entity is empty during OnLoad.  However, what I
found interesting is that NHibernate's IInterceptor.OnLoad is passed
the data read in from the database giving you a chance to change it
before it is used to populate the entity (which sounds like exactly
what you want).  But that information is not relayed down into the
ActiveRecordBase OnLoad method.  Not sure why that is.

So I guess one possible workaround is to create your own IInterceptor
(or inherit from NHibernate.EmptyInterceptor and override the OnLoad
functionality like ActiveRecord did).  You could have your expired
check there.  The InterceptorFactory.Create delegate can be assigned
to create an instance of your interceptor instead of the default
ActiveRecord one.

And this is all based on me skimming over the code for about 15-20
minutes, so take it with a grain of salt.  There may be an easier way
to do this.  For example, if you have an "Expired" property, could you
lazily decide it's state the first time it's called instead of doing
it at entity load time?

---
Patrick Steele
http://weblogs.asp.net/psteele



On Wed, Dec 16, 2009 at 8:32 PM, Paul de Wit <[email protected]> wrote:
> Anyone have any thoughts on this problem?
>
> On Thu, Dec 17, 2009 at 1:43 AM, Paul de Wit <[email protected]> wrote:
>>
>> Hey
>> Thanks for the quick reply it inherits from "ActiveRecordBase<Job>"
>> On Thu, Dec 17, 2009 at 12:59 AM, Wayne Douglas
>> <[email protected]> wrote:
>>>
>>> what does this class inherit from that provides the OnLoad method you're
>>> overriding?
>>> need some more info.
>>> w://
>>>
>>> On Wed, Dec 16, 2009 at 1:27 PM, paulddw <[email protected]> wrote:
>>>>
>>>> This method is inside a class called "Job". Everytime a job is loaded
>>>> I would like to check the status and set to expired if required.
>>>> However the properties on the instance are all null. How do I populate
>>>> the instance??
>>>>
>>>> protected override void OnLoad(object id)
>>>> {
>>>>     base.OnLoad(id);
>>>>     //manipulate data here
>>>>
>>>> }
>>>>
>>>> --
>>>>
>>>> You received this message because you are subscribed to the Google
>>>> Groups "Castle Project Users" 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/castle-project-users?hl=en.
>>>>
>>>>
>>>
>>>
>>>
>>> --
>>> Cheers,
>>>
>>> w://
>>>
>>> --
>>>
>>> You received this message because you are subscribed to the Google Groups
>>> "Castle Project Users" 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/castle-project-users?hl=en.
>>
>
> --
>
> You received this message because you are subscribed to the Google Groups
> "Castle Project Users" 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/castle-project-users?hl=en.
>

--

You received this message because you are subscribed to the Google Groups 
"Castle Project Users" 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/castle-project-users?hl=en.


Reply via email to