У меня есть класс с некоторыми свойствами и набор имен, например:
public class A : BaseObject
{
private Int32 zindex;
private Int32 atNmNr;
private IList<G020_Namen> names = new List<G020_Namen>();
}
Тогда у меня есть класс B, который расширяет класс A примерно так:
public class B : A
{
private Int32 zindex;
private String etiketnaam;
public B() { }
public virtual Int32 Zindex
{
get { return zindex; }
set { zindex = value; }
}
}
A и B связаны по своим первичным ключам. Класс B отображается в файле отображения класса A как объединенный подкласс, например:
<class name="A" table="A" lazy="true" >
<cache usage="read-write"/>
<id name="Zindex" type="Int32" >
<column name="Zindex" />
<generator class="assigned" />
</id>
<property name="AtNmNr" type="Int32">
<column name="ATNMNR"/>
</property>
<bag name="Namen" table="G020_Namen" inverse="true" cascade="all-delete-orphan" fetch="select" lazy="false" >
<cache usage="read-write"/>
<key>
<column name="NMNR" />
</key>
<one-to-many class="G020_Namen" />
</bag>
<joined-subclass name="B" table="B" >
<key column="Zindex" />
<property name="Zindex" type="Int32">
<column name="Zindex"/>
</property>
<property name="Etiketnaam" type="String">
<column name="Etiketnaam"/>
</property>
</joined-subclass>
Теперь, если я хочу получить записи для A, используя критерии, он работает нормально, и коллекция имен загружается. Но если я хочу получить записи для подкласса B, коллекция имен не загружается (в базовый класс A).
Затем я попытался добавить CreateCriteria для сопоставления коллекции:
ICriteria crit = session.CreateCriteria(typeof(B))
.CreateCriteria("Names", NHibernate.SqlCommand.JoinType.InnerJoin);
Это приводит к следующему SQL:
SELECT B.Zindex, B.Etiketnaam, G020_Namen.NMNAAM FROM B
INNER JOIN A ON B.Zindex = A.Zindex
INNER JOIN G020_Namen ON B.Zindex = G020_Namen.NMNR
Таким образом, он пытается связать таблицу с именами с первичным ключом таблицы подклассов B вместо внешнего ключа базовой таблицы A. Это должно быть:
SELECT B.Zindex, B.Etiketnaam, G020_Namen.NMNAAM FROM B
INNER JOIN A ON B.Zindex = A.Zindex
INNER JOIN G020_Namen ON A.AtNnNr = G020_Namen.NMNR
Вопрос в том, можно ли сделать так, чтобы NHibernate загружал коллекцию из базового класса из подкласса с помощью операторов ICriteria?
Спасибо
Мартин ван дер Линден.