I have an extension query that relies on an object knowing what
subclass it is. It is a collection of proxies initially, and I can get
at the base type of them but not the subclass. I'm not sure if I have
a mapping problem or a proxy problem.

The mappings and a test that exposes the problem are below.  How can I
get the subclass info from the CastleProxy?

Cheers,
Berryl

Mappings
============
Allocation has an ActivitySubject
============
<hibernate-...>

  <class name="..."       table="Allocations"  >

    <id name="Id" unsaved-value="0">
      <column name="AllocationId" />
      <generator class="hilo" />
    </id>

    <many-to-one class="ActivitySubject"
                 foreign-key="ActivityBase_FK" name="ActivitySubject">
      <column name="ActivitySubjectId" unique-key="DomainSignature" />
    </many-to-one>

    ....

  </class>

</hibernate-mapping>

================
ActivitySubject is a base class
================

<hibernate-mapping ...  >

  <class name="ActivitySubject" table="ActivitySubjects" discriminator-
value="BASE_CLASS">

    <id name="Id" unsaved-value="0">
      <column name="ActivitySubjectId" />
      <generator class="hilo" />
    </id>

    <discriminator column="ActivitySubjectType" type="System.String" /
>

    <property name="Description" length="75" not-null="true" />
    <property name="BusinessId" length="25" not-null="true" />

    <subclass name="Account" discriminator-value="ACCOUNT">

      ....

    </subclass>

    <subclass name="Project" discriminator-value="PROJECT">

      ...

    </subclass>

  </class>

</hibernate-mapping>

==================
example of problem
==================

        [Test]
        public void
Allocation_ActivitySubject_SubclassTypeCanBeKnown()
        {
            _session.Clear();

            Allocation found;
            using (var tx = _session.BeginTransaction())
            {
                found =
_session.Get<Allocation>(_someTransientAllocation.Id);
                Assert.That(found.ActivitySubject,
Is.EqualTo(_someTransientAllocation.ActivitySubject));
                Assert.That(found.ResourceSubject,
Is.EqualTo(_someTransientAllocation.ResourceSubject));
                Assert.That(found.TimeRange,
Is.EqualTo(_someTransientAllocation.TimeRange));

                NHibernateUtil.Initialize(found.ActivitySubject);

                // ok
                Assert.That(found.ActivitySubject,
Is.InstanceOf<ActivitySubject>());

                // *** not ok
                Assert.That(found.ActivitySubject,
Is.InstanceOf<Project>());

                tx.Commit();
            }
        }

Error info:
  Expected: instance of <Project>
  But was:  <Castle.Proxies.ActivitySubjectProxy>

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