NHibernate таблица на подкласс - добавление нового подкласса в существующий базовый класс - PullRequest
0 голосов
/ 16 октября 2010

У меня есть три класса, сопоставленные с использованием стратегии отображения классов таблицы на подкласс. Таблицы:

  • Изображения - 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 Ответ

1 голос
/ 16 октября 2010

Вы неправильно используете наследство. Отношение между продуктом / категорией и изображением не "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>

Вы также можете отобразить две обратные коллекции категорий и продуктов в изображении, чтобы увидеть, к каким элементам он был прикреплен.

...