我遇到了NHibernate映射的问题,我不确定我是否犯了noob错误或者我是否遇到了NHibernate的限制
我有三个域对象,带有关联的映射hbm.xml文件
人
SpecialPerson
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派生自人
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的集合&lt; ==这就是让我悲伤的原因
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不允许对象持有派生类型的集合,除非根据具体的类继承映射策略将该派生类型映射到表中。谁能开导我?
答案 0 :(得分:3)
我能够找到答案here
所以摘要是这与我试图引用派生类型的事实无关。集合的一对多元素中的class属性需要一个完全签名的名称。所以这个工作
<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的限制,这是一个很大的缓解,因为我正在考虑重写我们现有的大量映射的令人讨厌的任务。