views:

188

answers:

0

Is it possible to eagerly load polymorphic association using Linq and NH?

For example: Company is base class, Department is inherited from Company, and Company has association Employees to the User (one-to-many) and also association to the Country (many-to-one). Here is mapping part related to inherited class (without User and Country classes):

<class name="Company" discriminator-value="Company">
    <id name="Id" type="int" unsaved-value="0" access="nosetter.camelcase-underscore">
        <generator class="native"></generator>
    </id>
    <discriminator column="OrganizationUnit" type="string" length="10" not-null="true"/>
    <property name="Name" type="string" length="50" not-null="true"/>
    <many-to-one name="Country" class="Country" column="CountryId" not-null ="false" foreign-key="FK_Company_CountryId" access="field.camelcase-underscore" />
    <set name="Departments" inverse="true" lazy="true" access="field.camelcase-underscore">
        <key column="DepartmentParentId" not-null="false" foreign-key="FK_Department_DepartmentParentId"></key>
        <one-to-many class="Department"></one-to-many>
    </set>
    <set name="Employees" inverse="true" lazy="true" access="field.camelcase-underscore">
        <key column="CompanyId" not-null="false" foreign-key="FK_User_CompanyId"></key>
        <one-to-many class="User"></one-to-many>
    </set>
    <subclass name="Department" extends="Company" discriminator-value="Department">
        <many-to-one name="DepartmentParent" class="Company" column="DepartmentParentId" not-null ="false" foreign-key="FK_Department_DepartmentParentId" access="field.camelcase-underscore" />
    </subclass>
</class>

I do not have problem to eagerly load any of the association on the Company:

Session.Query<Company>().Where(c => c.Name == "Main Company").Fetch(c => c.Country).Single();
Session.Query<Company>().Where(c => c.Name == "Main Company").FetchMany(c => c.Employees).Single();

Also, I could eagerly load not-polymorphic association on the department:

Session.Query<Department>().Where(d => d.Name == "Department 1").Fetch(d => d.DepartmentParent).Single();

But I get NullReferenceException when I try to eagerly load any of the polymorphic association (from the Department):

Assert.Throws<NullReferenceException>(() => Session.Query<Department>().Where(d => d.Name == "Department 1").Fetch(d => d.Country).Single());
Assert.Throws<NullReferenceException>(() => Session.Query<Department>().Where(d => d.Name == "Department 1").FetchMany(d => d.Employees).Single());

Am I doing something wrong or this is not supported yet?