NHibernate/Hibernate中接口的映射集合

NHibernate/Hibernate中接口的映射集合,hibernate,nhibernate,interface,polymorphism,Hibernate,Nhibernate,Interface,Polymorphism,比如说,我有以下几点: 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 v

比如说,我有以下几点:

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; }
}
IList<IPet> pets = session.CreateCriteria<IPet>().List<IPet>();
以及以下映射:

<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>

现在,当我执行以下操作时:

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; }
}
IList<IPet> pets = session.CreateCriteria<IPet>().List<IPet>();
IList pets=session.CreateCriteria().List();
由于隐式多态性,一个很好的特性,它返回所有猫和狗。现在考虑这个问题:

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>
公共类宠物店
{
公共long?Id{get;set;}
公共列表宠物{get;set;}
}
我希望这将意味着pets集合将使用隐式多态性来填充集合,但是我得到了错误“关联引用未映射类:IntefaceCollectionExample.Domain.Entities.IPet”。我可以为只包含Id的IPet创建映射和表,但这感觉不直观。我可以使用union子类,但随后将失去使用generator class=“identity”的选项。我可以用很多对任何,但我觉得这将是相当笨拙的在这种情况下

有什么我遗漏的吗?是否有一种方法可以为IPet的接口创建映射,但不需要表,然后指定Cat和Dog实现该映射。或者有没有比我上面列出的方法更好的方法呢?

隐式多态性适用于
一对多
场景

您可以使用显式继承策略(即,必须从接口开始映射整个层次结构),或者为集合创建一个表,并将其映射为
多对多

隐式多态性适用于
一对多
场景


您可以使用显式继承策略(即,必须从接口开始映射整个层次结构),或者为集合创建一个表,并将其映射为
many to any

当您说必须映射整个继承人时,您是否主张像我提到的那样为IPet创建一个表?看来我想做的事就是做不到。太遗憾了,这将是一个很好的特性。@PaulTDavies:通过使用该策略,您可以避免为接口创建一个表。但这并不一定更好。当你说整个继承权必须被映射时,你是在提倡像我提到的那样为IPet建立一个表吗?看来我想做的事就是做不到。太遗憾了,这将是一个很好的特性。@PaulTDavies:通过使用该策略,您可以避免为接口创建一个表。但这并不一定更好。