未映射的关联引用 - 按子类策略的表映射的对象集合

时间:2012-09-11 05:31:53

标签: nhibernate mapping table-per-subclass

我遇到了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不允许对象持有派生类型的集合,除非根据具体的类继承映射策略将该派生类型映射到表中。谁能开导我?

1 个答案:

答案 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的限制,这是一个很大的缓解,因为我正在考虑重写我们现有的大量映射的令人讨厌的任务。