6

我有 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>

问题是我可以从产品实体中获取类别,但是当我尝试从类别中获取产品时它不起作用并且列表为空。

4

3 回答 3

1

我认为您不能listmany-to-many. 只有一侧可以是 a list- 另一侧应该只是一个bagor 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.

列表中的索引值应该从零开始顺序排列。我认为不可能对由同一张表驱动的两个列表执行此操作。

于 2011-08-12T03:55:28.483 回答
0

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 />因为它不需要。

于 2011-02-02T15:50:55.140 回答
0

您在映射中使用 <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> 

不确定解决方案的其余部分看起来可能是一个问题。

于 2011-02-02T16:20:47.533 回答