2011-07-24 11 views
1

セイ休止状態、私は次があります。マッピングコレクション/例えば

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がこれを実装するように指定します。それとも、私が上に挙げた方法よりも優れた方法がありますか?

答えて

1

暗黙的多型が明示的な継承を使用することができますいずれかone-to-manyシナリオ

ためnot supportedです戦略(すなわち、階層全体がマッピングされていなければならず、インタフェースから始める必要があります)、またはコレクションのテーブルを作成してmany-to-anyとしてマップします。

+0

ヒイラキー全体をマッピングする必要があると言うとき、私が言及したようにIPet用のテーブルを持っていることを提唱していますか?私がやりたかったことはできないようです。それは残念です - それはすてきな機能でしょう。 –

+0

@PaulTDavies:[具体的な表の表](http://www.nhforge.org/doc/nh/ja/index.html#inheritance-tableperconcrete)戦略を使用することで、インターフェース用の表を持つことを避けることができます。しかし、それは必ずしも良いとは限りません。 –