1

主な問題は、サブクラスがベース マップ コレクションに関連するすべての制約を削除することだと思います。

具体的なクラス戦略ごとのテーブルを使用して、親コレクションがサブクラスに関連付けられていないことがわかりました。これは、別の (おそらく関連する) 問題でもあり、Basetypes と ChildTypes の間の関連付けも作成されません。

私はこれに似たスキーマを持っています:

public class Parent{

   public virtual Int64 Id{get; set;}
   public virtual IList<Foo> foos{get; set;}
   public virtual IList<ParentType> _pts{get; set;}

}

public class child: Parent{
   public virtual int chilInt{get; set;}
}

public class BaseType{
   public virtual Int64 Id{get; set;}
   public virtual Parent ParentReference{get; set;}
}


public class ChildType: BaseType{
    public virtual string childBacon{get; set;}
}

マッピング ファイル

<class name="Parent" abstract="true">

<id name="Id" type="Int64" column="Id"  unsaved-value="0">
  <generator class="native"/>
</id>


<set name="foos" inverse="false"  >
  <key column="Id"/>
  <one-to-many class="Foo" />
</set>


<set name="pts" inverse="false"  >
  <key column="Id"/>
  <one-to-many class="ParentType" />
</set>


</class>

<union-subclass name="Child" table="Child" extends="Parent">
     <property name="childInt" type="int" />
</union-subclass>


<class name="ParentType" abstract="true">

  <id name="Id" type="Int64" column="Id"  unsaved-value="0">
   <generator class="native"/>
  </id>

 <many-to-one name="ParentReference" class="Parent"/>

</class>

<union-subclass name="ChildType" table="ChildType" extends="ParentType">
     <property name="childBacon" type="string" />
</union-subclass>

子テーブルが foo テーブルと関係がないという結果。

4

2 に答える 2

1

<union-subclass>マッピングを使用する場合、子テーブルには子クラスで宣言された追加のものしか含まれていないため、fooエントリと子テーブルの直接的な関係がないことは明らかです。

union-subclassマッピングを使用して子インスタンスをインスタンス化すると、親テーブルと子テーブルの両方に行が表示されます。また、子インスタンスにfooセットのエントリが含まれている場合、親テーブルに関連するfooテーブルのいくつかの行を取得します。

具象クラスマッピングごとにテーブルを使用することは、親クラスを指す関連付けでは意味がありません(コード例の一部ではないfooクラスがそうするように見えるため)。親の異なる派生クラスはすべてfooセットを継承しますが、fooテーブルは継承できません。それらすべてのテーブルへの外部キーを持っています。

于 2012-04-29T22:12:13.873 に答える
0

ORM と継承には 3 つの一般的なアプローチがあります (クラス階層ごとのテーブル、サブクラスごとのテーブル、具象クラスごとのテーブル)。<union-subclass>あなたが使用するものは、具体的なクラスごとにテーブルで使用され、親に埋め込む必要があります<class>。ここでそれについて読んでください(8.1.5)。

すべての問題が解決されるわけではありませんが、少なくとも継承のマッピングを確立するのに役立つはずです。

于 2012-04-25T20:37:23.540 に答える