【问题标题】:Association references unmapped - Collection of objects mapped by table per subclass strategy关联引用未映射 - 每个子类策略按表映射的对象集合
【发布时间】:2012-09-11 05:31:52
【问题描述】:

我在使用 NHibernate 映射时遇到问题,我不确定我是否犯了一个菜鸟错误,或者我是否遇到了 NHibernate 的限制

我有三个域对象以及关联的映射 hbm.xml 文件

专人
个人类别

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 不允许对象保存派生类型的集合,除非派生类型按照具体的类继承映射策略映射到表中。谁能赐教?

【问题讨论】:

    标签: nhibernate mapping table-per-subclass


    【解决方案1】:

    我找到了答案here

    所以总结是,这与我试图引用派生类型的事实无关。集合的一对多元素中的类属性需要一个完全签名的名称。所以这行得通

    <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 的限制,当我正在考虑重写许多现有映射的令人讨厌的任务时,这让我松了一口气。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多