Отношения NHibernate имеют проблему с двунаправленным получением данных
У меня есть 2 таблицы, которые имеют отношение ко многим.
Кодекс сущностей
public class Product : BaseEntity
{
public virtual string Name { get; set; }
public virtual IList<Category> ProductCategory { get; set; }
public virtual float Price { get; set; }
public virtual string Description { get; set; }
public virtual DateTime DateOfAdd { get; set; }
public virtual float Discount { get; set; }
public virtual int SaleCount { get; set; }
public virtual byte[] Image { get; set; }
}
public class Category : BaseEntity
{
public virtual string Name { get; set; }
public virtual string Description { get; set; }
public virtual IList<Product> CategoryProducts { get; set; }
public virtual void AddProduct(Product product)
{
this.CategoryProducts.Add(product);
}
public virtual void DeleteProduct(Product product)
{
this.CategoryProducts.Remove(product);
}
}
Я отображаю эти классы как многие ко многим в соответствии с отображением.
relationalMapper.ManyToMany<Product, Category>();
В xml это отображение компилируется в следующее:
<class name="Product">
<id name="Id" type="Int32">
<generator class="identity" />
</id>
<property name="Name" />
<list name="ProductCategory" table="ProductCategory">
<key column="product_key" />
<list-index />
<many-to-many class="Category" column="category_key" />
</list>
<property name="Price" />
<property name="Description" />
<property name="DateOfAdd" />
<property name="Discount" />
<property name="SaleCount" />
<property name="Image" lazy="true" />
</class>
<class name="Category">
<id name="Id" type="Int32">
<generator class="identity" />
</id>
<property name="Name" />
<property name="Description" />
<list name="CategoryProducts" table="ProductCategory" inverse="true">
<key column="category_key" />
<list-index />
<many-to-many class="Product" column="product_key" />
</list>
</class>
Проблема в том, что я могу получить категории от объекта продукта, но когда я пытаюсь получить продукты из категории, это не работает, и список пуст.
3 ответа
Я не думаю, что вы можете иметь list
по обе стороны от many-to-many
, Только одна сторона может быть list
- другая сторона должна быть просто bag
или же set
, Рассмотрим следующие данные в таблице ProductCategory:
Category_id Product_id Index
=========== ========== =====
1 3 0
1 4 1
2 3 0
2 4 1
Если вы получаете доступ Category.CategoryProducts
, все хорошо. Категория № 1 имеет два продукта: первый продукт № 3 и второй № 4.
Тем не менее, если вы пытаетесь получить доступ Product.ProductCategory
, тот же самый Index
столбец также не может быть использован для этого списка. Наши данные говорят, что продукт № 3 имеет две категории: № 1 и № 2, но обе они хотят быть первой категорией в списке, с Index = 0
, Продукт № 4 также имеет две категории, но ни одна из них не хочет быть первой категорией в списке, потому что они обе имеют Index = 1
,
Значения индекса в списке должны быть последовательными, начиная с нуля. Я не думаю, что это возможно сделать для двух списков, управляемых одной и той же таблицей.
Вы используете <key column="category_key" />
вместо <key column="product_key" />
в вашем отображении для
<list name="CategoryProducts" table="ProductCategory" inverse="true">
<key column="category_key" />
<list-index />
<many-to-many class="Product" column="product_key" />
</list>
Не уверен, что остальная часть решения выглядит как проблема.
Атрибут inverse не должен иметь ничего общего с выбором, он должен влиять только на то, какая сущность контролирует отношения.
У меня точно такая же конфигурация, хотя я использую <set>
вместо <list>
:
<set name="Organizations" table="ORGANIZATIONS_LOCATIONS" inverse="true">
<key column="LOCATION_ID" />
<many-to-many class="Organization" column="ORGANIZATION_ID" />
</set>
<set name="Locations" table="ORGANIZATIONS_LOCATIONS" inverse="false" cascade="all">
<key column="ORGANIZATION_ID" />
<many-to-many class="Location" column="LOCATION_ID" />
</set>
Возможно, попробуйте изменить отображение на набор и удалить <list-index />
так как это не нужно.