基本上,我试图从与自身具有多对多关系的表中提取记录。这是一个产品表,它必须与许多成分(其他产品)相关联。问题是,当我从具有多个关联成分的产品中提取数据时,NHibernate 会为产品所具有的每种成分返回一个对象实例。这是我的班级映射和结构的方式:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="TCC" namespace="TCC.Hibernate.Domain.Classes">
<class name="Product" table="product">
<id name="id" generator="identity">
<column name="id" not-null="true" />
</id>
<property name="name">
<column name="name" length="128" not-null="true" />
</property>
<property name="stock">
<column name="stock" not-null="true" />
</property>
<property name="value">
<column name="value" not-null="true" />
</property>
<many-to-one name="category" class="Category" column="category" not-null="true" fetch="join" lazy="false" />
<!-- Relations -->
<set name="ingredients" table="product_x_ingredient" fetch="join" lazy="true">
<key column="product_id" />
<many-to-many class="Product" column="ingredient_id" />
</set>
<set name="suppliers" table="product_x_supplier" fetch="join" lazy="true">
<key column="product_id" />
<many-to-many class="Supplier" column="supplier_id" />
</set>
<set name="saleItems" lazy="true" inverse="true">
<key column="product_id" />
<one-to-many class="SaleItem" />
</set>
<set name="stockInlets" lazy="true" inverse="true">
<key column="product" />
<one-to-many class="StockInlet" />
</set>
</class>
namespace TCC.Hibernate.Domain.Classes
{
class Product
{
public Product()
{
suppliers = new HashSet<Supplier>();
ingredients = new HashSet<Product>();
}
public virtual uint id { get; set; }
public virtual string name { get; set; }
public virtual float stock { get; set; }
public virtual float value { get; set; }
public virtual Category category { get; set; }
public virtual ICollection<Supplier> suppliers { get; set; }
public virtual ICollection<Product> ingredients { get; set; }
public virtual ISet saleItems { get; set; }
public virtual ISet stockInlets { get; set; }
}
}
这就是我从数据库中提取数据的方式:
using (ISession Session = NHibernateHelper.OpenSession())
{
return Session
.CreateCriteria<Product>()
.SetFetchMode("ingredients", FetchMode.Eager)
.SetFetchMode("suppliers", FetchMode.Eager)
.List<Product>();
}
有谁知道为什么?我究竟做错了什么?