我将 NHibernate 与 Fluent 映射一起使用,并且当我加入多对多关系时遇到重复条目的问题。下面我的简单示例有两个类,PurchaseOrder 和 Product。一个 PurchaseOrder 可以有多个 Products,一个 Product 可以是多个 PurchaseOrders 的一部分。
当我尝试检索 PurchaseOrder 及其产品时,我会为每个产品重复相同的 PurchaseOrder。(因此,如果 PurchaseOrder 有 5 个产品,我将在我的结果中看到相同的 PurchaseOrder 5 次。每个都有 5 个产品。)
这是我的设置:
表
PurchaseOrder
OrderID OrderDate
1 2013-01-01
2 2013-01-02
Product
ProductID Name
1 Widget
2 Thing
OrderProducts
OrderID ProductID
1 1
1 2
2 1
2 2
课程
public class PurchaseOrder
{
public virtual int OrderID { get; set; }
public virtual DateTime? OrderDate { get; set; }
public virtual IList<Product> Products { get; set; }
}
public class Product
{
public virtual int ProductID { get; set; }
public virtual string Name { get; set; }
public virtual IList<PurchaseOrder> Orders { get; set; }
}
映射
public class PurchaseOrderMapping : ClassMap<PurchaseOrder>
{
public PurchaseOrderMapping()
{
Id(x => x.OrderID, "OrderID");
Map(x => x.OrderDate, "OrderDate");
HasManyToMany(x => x.Products)
.Table("OrderProducts")
.Schema("dbo")
.ParentKeyColumn("OrderID")
.ChildKeyColumn("ProductID");
Schema("dbo");
Table("PurchaseOrder");
}
}
public class ProductMapping : ClassMap<Product>
{
public ProductMapping ()
{
Id(x => x.ProductID, "ProductID");
Map(x => x.Name, "Name");
HasManyToMany(x => x.Orders)
.Table("OrderProducts")
.Schema("dbo")
.ParentKeyColumn("OrderID")
.ChildKeyColumn("ProductID")
.Inverse();
Schema("dbo");
Table("Product");
}
}
查询结束
var orderList = session.QueryOver<PurchaseOrder>()
.JoinQueryOver<Product>(o => o.Products)
.List();
我希望 orderList 有 2 个 PurchaseOrders,但它实际上有 4 个。重复 OrderID=1 对应的对象,OrderID=2 也是如此
foreach(var o in orderList) { Console.WriteLine(o.OrderID); }
Output:
1
1
2
2
更进一步,如果我比较具有相同 ID 的对象,它们就是同一个对象。
System.Console.WriteLine(Object.ReferenceEquals(orderList[0], orderList[1]));
System.Console.WriteLine(Object.ReferenceEquals(orderList[2], orderList[3]));
Output:
True
True
为什么 NHibernate 会复制结果中的对象?我如何排除它们并只获得我的 2 个订单列表,每个订单都有对应的 2 个产品?