我正在使用 NHibernate 进行一些测试,目前我有两个映射实体,Orders 和 Products。与往常一样,Order 包含Products 的集合,我将其映射为:
<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>();
假设我在数据库中有一个持久化的Order(John 的订单)及其Products 集合中的一些项目(一个苹果、一个橙子和一个椰子)并且我尝试向集合中添加一个新项目(一根香蕉)我可以从 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 会从 Products 表中删除所有关联以重新创建它们?如何避免?
提前致谢!
PS:我尝试使用此 SO Question 中建议的 inverse 映射属性但即使新产品被保存,它与订单的关联也不会被保存。
编辑:
这是我用来修改产品列表的代码:
Order order = session.Load<Order>(orderId);
order.Products.Add(new Product() { Name = "Banana" });
using (ITransaction transaction = session.BeginTransaction())
{
session.Update(order);
transaction.Commit();
}
最佳答案
SO 上已经有类似的问题:NHibernate Many-To-Many Is Deleting All Associations Before Inserting
来自 NHibernate 的 documentation :
Bags are the worst case. Since a bag permits duplicate element values and has no index column, no primary key may be defined. NHibernate has no way of distinguishing between duplicate rows. NHibernate resolves this problem by completely removing (in a single DELETE) and recreating the collection whenever it changes. This might be very inefficient.
关于c# - 当我向其中添加一项时,为什么 NHibernate 会删除并重新创建集合中的所有关联?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10955251/