比如说,我有以下内容:
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>
我希望这意味着宠物的集合会使用隐式多态来填充集合,但我得到错误'Association references unmapped class:IntefaceCollectionExample.Domain.Entities.IPet'。我可以为IPet创建一个映射和表,只包含Id,但这感觉不直观。我可以使用union-subclass但是会丢失使用generator class =“identity”的选项。我可以使用多对多但我觉得在这种情况下这会非常笨拙。
有什么我想念的吗?有没有办法为IPet接口创建映射但不需要表,然后指定Cat和Dog实现它。或者有没有比我上面列出的方法更好的方法?
答案 0 :(得分:1)
one-to-many
场景的隐式多态性为not supported
您可以使用显式继承策略(即必须映射整个层次结构,从界面开始),或者为集合创建一个表并将其映射为many-to-any
。