Я новичок в мире 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?
Как я могу сделать то и другое с изменением только в отображаемых файлах гибернации? Я попробовал несколько вариантов, но не смог заставить его работать.
Заранее спасибо