2

NHibernate のマッピングに問題があり、初歩的なミスを犯したのか、それとも NHibernate の制限に遭遇したのかわかりません。

関連するマッピング hbm.xml ファイルを持つ 3 つのドメイン オブジェクトがあります。
Person
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 は 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>

セッションを作成しようとすると、「関連付けがマップされていないクラスを参照しています: SpecialPerson」という NHibernate.MappingException が発生します。

テーブル属性を指定することは想定されていないため、適切な構文を使用していませんが、派生型を参照しようとしているときに何か他のものを使用している、または
NHibernate はオブジェクトが派生型のコレクションを保持することを許可していませんその派生型が具象クラス継承マッピング戦略ごとにテーブルにマップされていない限り、型。誰でも私を啓発できますか?

4

1 に答える 1

3

ここで答えを見つけることができました

つまり、これは派生型を参照しようとしていたという事実とは何の関係もないということです。セットの 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 の制限ではありませんでした。これは、既存のマッピングの多くを書き直すという不快な作業を考えていたので、非常に安心しました。

于 2012-09-11T07:48:29.350 に答える