我使用table-per-subclass类映射策略映射了三个类。表格是:
我们正如此映射:
<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
,但由于我使用的是动态代理,因此失败了。
谢谢, 本
答案 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>
您还可以在图像中映射类别和产品的两个反向集合,以查看它附加到哪些元素。