NHibernate table-per-subclass - 向现有基类添加新的子类

时间:2010-10-16 15:45:40

标签: nhibernate nhibernate-mapping

我使用table-per-subclass类映射策略映射了三个类。表格是:

  • 图片 - ImageId,FileName,ImageData
  • CategoryImages - CategoryId,ImageId
  • ProductImages - ProductId,ImageId

我们正如此映射:

<class name="CatalogImage" table="Images">
<id name="Id" column="ImageId">
  <generator class="guid.comb"/>
</id>
<property name="FileName"/>
<property name="ImageData" lazy="true"/>

<joined-subclass name="CategoryImage" table="CategoryImages">
  <key column="ImageId"/>
  <many-to-one name="Category" column="CategoryId"/>
</joined-subclass>
<joined-subclass name="ProductImage" table="ProductImages">
  <key column="ImageId"/>
  <many-to-one name="Product" column="ProductId"/>
</joined-subclass>

我可以保存Image,CatalogImage和ProductImage的实例。

然而,以这种方式组合图像类型的主要原因是我有一个中央图像库,我可以从中抓取图像并将它们附加到产品,类别等。

这是我正在努力的部分。如何检索Image的实例并使用它来创建ProductImage的实例,并在保存时添加对ProductImage表的引用。

我尝试了一个基本的投射(ProductImage)normalImage,但由于我使用的是动态代理,因此失败了。

谢谢, 本

1 个答案:

答案 0 :(得分:1)

你滥用继承权。产品/类别和图像之间的关系不是“is-a”,而是“has-a”或“has-many”(组合)。

因此,如果一个产品有很多图像,那么使用您当前的数据库结构,您只需在产品中映射一组图像; ProductImage不是一个类。

示例:

class Product
{
    public virtual ICollection<Image> Images { get; set; }
}

映射:

<class name"Product">
  ...
  <set name="Images" table="ProductImages">
    <key column="ProductId"/>
    <many-to-many column="ImageId" class="Image"/>
  </set>
</class>

您还可以在图像中映射类别和产品的两个反向集合,以查看它附加到哪些元素。