为什么NHibernate在添加一个项目时会删除并重新创建集合中的所有关联?

时间:2012-06-08 19:52:34

标签: c# nhibernate nhibernate-mapping

我正在使用NHibernate进行一些测试,目前我有两个映射实体,订单产品。与往常一样,订单包含产品的集合,我将其映射为:

<bag name="Products" cascade="all" lazy="true">
  <key column ="Order_ID" />
  <many-to-many class="Product" column="Product_ID" />
</bag>

在C#方面:

public virtual IList<Product> Products
{
    get { return _Products; }
    set { _Products = value; }
}
private IList<Product> _Products = new List<Product>();

如果我在数据库中有一个持久的订单(约翰的订单),其产品集合中的一些商品(苹果,橙子和椰子)和我尝试在集合中添加一个新项目(香蕉)我可以从SQL输出中看到NHibernate正在做这样的事情:

INSERT INTO Products_Table (Product_Name, Product_ID) VALUES ('Banana', @Banana_ID)
DELETE FROM Products WHERE Order_ID = @Johns_Order_ID
INSERT INTO Products (Order_ID, Product_ID) VALUES (@Johns_Order_ID, @Apple_ID)
INSERT INTO Products (Order_ID, Product_ID) VALUES (@Johns_Order_ID, @Orange_ID)
INSERT INTO Products (Order_ID, Product_ID) VALUES (@Johns_Order_ID, @Coconut_ID)
INSERT INTO Products (Order_ID, Product_ID) VALUES (@Johns_Order_ID, @Banana_ID)

而不是简单地做这样的事情:

INSERT INTO Products_Table (Product_Name, Product_ID) VALUES ('Banana', @Banana_ID)
INSERT INTO Products (Order_ID, Product_ID) VALUES (@Johns_Order_ID, @Banana_ID)

那么为什么NHibernate会删除产品表中的所有关联,以便在我只是尝试在其中插入新产品时再次重新创建它们?如何避免呢?

提前致谢!

PS:我尝试使用此SO Question中建议的反向映射属性,但即使新产品已保存,它与订单的关联也不会。

修改

以下是我用来修改产品列表的代码:

Order order = session.Load<Order>(orderId);
order.Products.Add(new Product() { Name = "Banana" });
using (ITransaction transaction = session.BeginTransaction())
{
    session.Update(order);
    transaction.Commit();
}

1 个答案:

答案 0 :(得分:5)

在SO上已经存在类似的问题:NHibernate Many-To-Many Is Deleting All Associations Before Inserting

来自NHibernate的documentation

  袋子是最糟糕的情况。由于行李允许重复的元素值   并且没有索引列,也没有定义主键。 NHibernate有   无法区分重复的行。 NHibernate解决了   通过完全删除(在单个DELETE中)和   每当它改变时重新创建它。这可能非常   低效的。