Hi List,

I'm responsible for looking at NHibernate as a potential DB solution
on our next product release -- but I'm having trouble getting my
prototype to work properly.  In a few cases, I'm getting perplexing
behaviour associated with lazy loading and proxies.  I suspect that
these are all occuring because I have some error in my understanding
of how these work.

Here's my first problem.   I'm encountering a
LazyInitializationException when my WebApp testing front end tries to
display a DataGrid with information about objects of type Instrument.

---------------- Application information ------------------
The application manages electronic medical instruments in a hospital.

Part of our object system is a heiarchy of parent/child relationships
(parent owns a collection of children; children have a reference to
their parent; I don't think either end is set inverse="true")

Institution                       (e.g. Springfield Hospital)
    Location                     (e.g. Emergency Room)
        Instrument

Institution and Location are effectively "virtual" classes (though
they're not explicitly marked as such); they each have 2 subclasses
that are used in the database.

References in the source code to other objects such as
HealthCareSystem and Method are unimportant.

------------------------------------ Source Code
-------------------------------------------
<Locations.aspx.cs>
...
        private void BindInstrumentGrid()
        {
            ...

            grInstr.DataSource =
Facade.InstLoc.GetInstruments(<various parameters>);
            grInstr.DataBind();
        }

<InstrumentFacade.cs>
...
        public IList GetInstruments(<various parameters>)
        {
            IList<Instrument> instrumentList;
            ...

            using (ISession ses = NHibernateHelper.OpenSession())
            using (ses.BeginTransaction())
            {
                instrumentList = ses.CreateQuery(
                    @"SELECT instr FROM Instrument AS instr
                    JOIN instr.Method AS md
                    JOIN md.Method AS meth
                    JOIN instr.Location AS loc
                    JOIN loc.Institution AS instit
                    JOIN instit.HCSystem AS hcs
                    WHERE meth.Name=:method_name
                    AND loc.Name=:location_name
                    AND instit.Name=:institution_name
                    AND hcs.Name=:healthcaresystem_name")
                    .SetString("method_name", methodName)
                    .SetString("location_name", asLocationName)
                    .SetString("institution_name", asInstName)
                    .SetString("healthcaresystem_name",
asHCSystemName)
                    .List<Instrument>();

                foreach (Instrument i in instrumentList)
                {
                    NHibernateUtil.Initialize(i.Location);
                    NHibernateUtil.Initialize(i.Location.Institution);
                }

                ses.Transaction.Commit();
            }
            return instrumentList.ToList();
        }
...
----------------------------------------------------------------------------------------------------

On application execution, when BindInstrumentGrid() executes
"grInstr.DataBind();" I get the following NHibernate exception:
"Initializing[TestRecordProto.Domain.Institution#2]-Could not
initialize proxy - no Session."

I partially understand why I'm getting this error, because I'm seeing
weird behavior during NHibernateUtil.Initialize() when I run in debug
mode.  Initially, i.Location is of type LocationProxy -- with its only
set property being "string Name".  All other properties, including the
int ID, is uninitialized.  But after "Initialize(i.Location)", I would
expect i.Location proxy would be replaced with a real object of type
Location.  But it is not in fact replaced -- the reference is left as
a proxy, and its properties do not change!  And of course then
"Initialize(i.Location.Institution)" can not really initialize the
Institution field -- because i.Location.Institution is null, because
i.Location is a proxy without instantiated properties!

So I don't know what I'm doing wrong -- I'm supposed to call
Initialize() on the referenced objects that I'll need to access after
the session is closed -- and yet Initialize() isn't solving the
problem for me.  Why does this happen?

The information in the database all looks correct, with the correct
links between these objects.  I have 1 record saved of type
Instrument, which is linked by foreign key to a valid Location, which
is linked  by foreign key to a valid Institution.


Thank you in advance.

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