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

listの両側に を持つことはできないと思いますmany-to-many。片側だけを a にすることができます。list反対側はbagorにする必要がありsetます。ProductCategory テーブルの次のデータを検討してください。

Category_id Product_id Index
=========== ========== =====
1           3          0
1           4          1
2           3          0
2           4          1

にアクセスすればOKですCategory.CategoryProducts。カテゴリ #1 には 2 つの製品があります。最初の製品は #3 で、2 番目の製品は #4 です。

ただし、 にアクセスしようとすると、このリストProduct.ProductCategoryに同じIndex列を使用することはできません。私たちのデータによると、製品 #3 には #1 と #2 の 2 つのカテゴリがありますが、どちらもリストの最初のカテゴリになりたいと考えていますIndex = 0。製品 #4 にも 2 つのカテゴリがありますが、どちらも を持っているため、どちらもリストの最初のカテゴリにはなりたくありませんIndex = 1

リスト内のインデックス値は、0 から連続している必要があります。同じテーブルによって駆動される 2 つのリストに対してこれを行うことはできないと思います。

于 2011-08-12T03:55:28.483 に答える
0

inverse 属性は select とは何の関係もありません。関係を制御するエンティティにのみ影響するはずです。

<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 に答える