Отношения NHibernate - PullRequest
       3

Отношения NHibernate

0 голосов
/ 22 марта 2011

Я новичок в мире NHibernate, поэтому, пожалуйста, потерпите меня.

Мои таблицы довольно просты

TB_Products
IdProduct

TB_Attributes
IdAttribute

TB_Attributes_Locale
IdAttribute
IdLanguage
AttributeValue

TB_Link_Products_Attributes
IdAttribute
IdProduct

TB_Products_Locale
IdProduct
IdLanguage
ProductName

И мои уроки:

public class LocalizedStrings
{
    public string NameOrValue { get; set; }

    public LocalizedStrings() { }
}

public class Products
{
    private IList<Attributes> _productAttributes;
    private IDictionary<int, LocalizedStrings> _allLocalizedProduct;

    public virtual IDictionary<int, LocalizedStrings> AllLocalizedProduct
    {
        get { return _allLocalizedProduct; }
        set { _allLocalizedProduct = value; }
    }
    public virtual IList<Attributes> ProductAttributes
    {
        get { return _productAttributes; }
        set { _productAttributes = value; }
    }
    public Products() {}
}
public class Attributes
{
    private IDictionary<int, LocalizedStrings> _allLocalizedAttributes;

    public virtual IDictionary<int, LocalizedStrings> AllLocalizedAttributes 
    {
        get { return _allLocalizedAttributes; }
        set { _allLocalizedAttributes = value; }
    }

    public Attributes() { }
}

И мое отображение nhibernate:

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <class name="Products" table="TB_Products">
      <id name="Id">
        <column name="IdProduct" not-null="true"/>
        <generator class="native" />
      </id>

      <bag name="ProductAttributes" table="TB_Link_Products_Attributes" cascade="all-delete-orphan" generic="true">
        <key column="IdProduct" />
        <many-to-many class="Attributes" column="IdAttribute" />
       </bag>
       <map name="AllLocalizedProduct" cascade="all-delete-orphan" table="TB_Products_Locale" lazy="false">
         <key column="IdProduct" />
         <index column="IdLanguage" type="System.Int32" />
         <composite-element class="LocalizedStrings">
           <property name="NameOrValue" column="ProductName" />
         </composite-element>
       </map>
   </class>
</hibernate-mapping>

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
   <class name="Attributes" table="TB_Attributes">
      <id name="Id">
         <column name="IdAttribute" not-null="true"/>
         <generator class="native" />
      </id>
      <map name="AllLocalizedAttributes" table="TB_Attributes_Locale" lazy="false">
         <key column="IdAttribute" />
         <index column="IdLanguage" type="System.Int32" />
         <composite-element class="LocalizedStrings">
           <property name="NameOrValue" column="AttributeValue" />
         </composite-element>
      </map>
   </class>
</hibernate-mapping>

Хорошо, что у меня в базе данных:

TB_Products
IdProduct 
1
2
3

TB_Products_Locale
IdProduct   IdLanguage   ProductName
1           1            Bronze Statue
1           2            Statue en Bronze
2           1            Silver Statue
2           2            Statue en Argent
3           1            Wooden Statue

TB_Attributes
IdAttribute
11
12
13
14
15

TB_Attributes_Locale
IdAttribute  IdLanguage  AttributeName 
11            1           Randy Green
12            1           Thomas Martin
13            1           Bronze
13            2           Bronze in French
14            1           Silver
14            2           Argent (Silver in French) 
15            1           Wood

TB_Link_Products_Attributes
IdProduct    IdAttribute
1            11
2            12
1            13
2            14
3            11
3            15

На человеческом языке это будет:
Бронзовая статуя (перевод на французский язык), выполненная Рэнди Грин и изготовленная на бронзе (также перевод на французский язык)
Серебряная статуя (перевод на французский язык), выполненная Томасом Мартином и выполненная в серебре (перевод на французский язык)
Деревянная статуя (не переведена на французский язык), созданная Рэнди Грин и изготовленная из дерева (не переведена на французский язык)

Что я хочу сделать:
1. Если мне нужно сменить скульптора Серебряной статуи с Томаса Мартина на Рэнди Грина, я хочу, чтобы Томаса Мартина также удалили из TB_Attributes и TB_Attributes_Locale, поскольку он становится бесхозным, не имеет отношения к каким-либо другим продуктам. Но, конечно, если атрибуты все еще связаны с другими продуктами, не удаляйте их.
2. Если, наконец, нам не нужен перевод на французский для серебра (IdAttribute = 14), если я удалил перевод на французский язык в своем свойстве AllLocalizedAttributes из моего объекта, как он также может автоматически удаляться из таблицы TB_Attributes_Locale?

Как я могу сделать то и другое с изменением только в отображаемых файлах гибернации? Я попробовал несколько вариантов, но не смог заставить его работать.

Заранее спасибо

...