セイ休止状態、私は次があります。マッピングコレクション/例えば
public interface IPet
{
long? Id { get; set; }
string Name { get; set; }
}
public class Cat : IPet
{
public virtual long? Id { get; set; }
public virtual string Name { get; set; }
}
public class Dog : IPet
{
public virtual long? Id { get; set; }
public virtual string Name { get; set; }
}
そして以下のマッピング:今
<class name="Cat" table="`Cat`" >
<id name="Id" type="long">
<generator class="identity"/>
</id>
<property name="Name"/>
</class>
<class name="Dog" table="`Dog`" >
<id name="Id" type="long">
<generator class="identity"/>
</id>
<property name="Name"/>
</class>
私は次のようにします。
IList<IPet> pets = session.CreateCriteria<IPet>().List<IPet>();
暗黙の多型性のために、素晴らしい機能です。すべての猫と犬を返します。今、このことを考慮してください。
public class PetShop
{
public long? Id { get; set; }
public List<IPet> Pets { get; set; }
}
<class name="PetShop" table="`PetShop`" >
<id name="Id" type="long">
<generator class="identity"/>
</id>
<property name="Name"/>
<bag name="Pets" cascade="all">
<key column="PetShopId"/>
<one-to-many class="IPet"/>
</bag>
</class>
私は、これはコレクションを埋めるために暗黙的ポリモーフィズムを使用することになり、ペットのコレクションを意味するだろう期待していたが、その代わりに、私はエラーが出る協会の参照マップされていないクラスを:IntefaceCollectionExample.Domain.Entities.IPet」を。私は、IPetの魔法使いのためのマッピングとテーブルを作成することができたのはIdだけでしたが、これは直感的ではありません。私はunion-subclassを使うことができましたが、generator class = "identity"を使うオプションを失います。私は多対多を使うことができましたが、この場合、これはむしろやっかいな感じです。
紛失しているものがありますか? IPetのインターフェイスのマッピングを作成する方法はありますか?テーブルは必要ありません。そして、CatとDogがこれを実装するように指定します。それとも、私が上に挙げた方法よりも優れた方法がありますか?
ヒイラキー全体をマッピングする必要があると言うとき、私が言及したようにIPet用のテーブルを持っていることを提唱していますか?私がやりたかったことはできないようです。それは残念です - それはすてきな機能でしょう。 –
@PaulTDavies:[具体的な表の表](http://www.nhforge.org/doc/nh/ja/index.html#inheritance-tableperconcrete)戦略を使用することで、インターフェース用の表を持つことを避けることができます。しかし、それは必ずしも良いとは限りません。 –