每个子类的NHibernate表-向现有基类添加新的子类

每个子类的NHibernate表-向现有基类添加新的子类,nhibernate,nhibernate-mapping,Nhibernate,Nhibernate Mapping,我使用每个子类映射策略映射了三个类。各表如下: 图像-图像ID、文件名、图像数据 CategoryImages-CategoryId,ImageId ProductImages-ProductId,ImageId 我们正在这样映射: <class name="CatalogImage" table="Images"> <id name="Id" column="ImageId"> <generator class="guid.comb"/> </

我使用每个子类映射策略映射了三个类。各表如下:

  • 图像-图像ID、文件名、图像数据
  • 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表

我尝试了一个基本的cast
(ProductImage)normalImage
,但是失败了,因为我使用的是动态代理

谢谢,

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

所以,如果一个产品有许多图像,使用您当前的数据库结构,您可以只映射产品中的一组图像;ProductImage不是一个类

例如:

class Product
{
    public virtual ICollection<Image> Images { get; set; }
}
类产品
{
公共虚拟ICollection映像{get;set;}
}
映射:

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

...

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

如果要为产品图像和类别图像指定不同的显示顺序,该怎么办。用上面的例子,我还能做到这一点吗?我想我已经回答了我自己的问题。我可以使用一个列表并指定索引列。这是正确的。您只需将
更改为
ICollection
更改为
IList
,然后添加