Отношения NHibernate имеют проблему с двунаправленным получением данных - PullRequest
6 голосов
/ 25 января 2011

У меня есть 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 ]

1 голос
/ 12 августа 2011

Я не думаю, что вы можете иметь 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.

Значения индекса в списке должны быть последовательными, начиная с нуля. Я не думаю, что это возможно сделать для двух списков, управляемых одной и той же таблицей.

0 голосов
/ 02 февраля 2011

Вы используете <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> 

Не уверен, что остальная часть решения выглядит как проблема.

0 голосов
/ 02 февраля 2011

Инверсный атрибут не должен иметь ничего общего с выбором, он должен влиять только на то, какая сущность контролирует отношения.

У меня точно такая же конфигурация, хотя я использую <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 />, так как он не нужен.

...