Связи ссылок не сопоставлены - коллекция объектов, сопоставленных таблицей в соответствии со стратегией подкласса
У меня проблемы с отображением NHibernate, и я не уверен, сделал ли я ошибку noob или столкнулся с ограничением NHibernate
У меня есть три объекта домена с соответствующими файлами сопоставления hbm.xml
Человек
Особенный человек
PersonCategory
public class Person
{
public virtual int Id { get; set; }
public virtual string Name { get; set; }
}
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="Person"
table="Person">
<id name="Id" column="PersonID">
<generator class="native" />
</id>
<property name="Name" />
</class>
</hibernate-mapping>
SpecialPerson происходит от Person
public class SpecialPerson : Person
{
public virtual string MagicString { get; set; }
public virtual PersonCategory PersonCategory { get; set; }
}
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<joined-subclass name="SpecialPerson"
extends="Person">
<key column="PersonID" />
<property name="MagicString" />
<many-to-one name="PersonCategory" column="PersonCategoryID" cascade="save-update" />
</joined-subclass>
</hibernate-mapping>
и PersonCategory содержит коллекцию SpecialPersons <== это то, что вызывает у меня горе
public class PersonCategory
{
public virtual int Id { get; set; }
public virtual ICollection<SpecialPerson> Persons { get; set; }
}
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
<class name="PersonCategory"
table="PersonCategory">
<id name="Id" column="PersonCategoryID">
<generator class="native" />
</id>
<set name="Persons" table="SpecialPerson" inverse="true">
<key column="PersonCategoryID" />
<one-to-many class="SpecialPerson"/>
</set>
</class>
</hibernate-mapping>
Когда я пытаюсь создать сеанс, я получаю NHibernate.MappingException, говорящее "Ассоциация ссылается на не сопоставленный класс: SpecialPerson"
Либо я не использую правильный синтаксис, так как я не должен указывать атрибут таблицы, но что-то еще, когда я пытаюсь ссылаться на производный тип ИЛИ
NHibernate не позволяет объекту содержать коллекцию производного типа, если этот производный тип не отображается в таблице в соответствии с конкретной стратегией отображения наследования классов. Кто-нибудь может просветить меня?
1 ответ
Я смог найти ответ здесь
Итак, в итоге, это не имеет ничего общего с тем фактом, что я пытался ссылаться на производный тип. Атрибуту класса в элементе набора "один ко многим" требовалось полностью подписанное имя. Так что это работает
<set name="Persons" table="SpecialPerson">
<key column="PersonCategoryID" />
<one-to-many class="NHibernateTest.Domain.Test.SpecialPerson, NHibernateTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
</set>
Я понятия не имею, почему в этом случае ему понадобилось полностью подписанное имя, когда я использовал упрощенное имя везде без проблем.
Так что это не было ограничением с NHIbernate, что было большим облегчением, так как я размышлял о сомнительной задаче переписывания многих наших существующих отображений.