c# - 当我向其中添加一项时,为什么 NHibernate 会删除并重新创建集合中的所有关联?

标签 c# nhibernate nhibernate-mapping

我正在使用 NHibernate 进行一些测试,目前我有两个映射实体,OrdersProducts。与往常一样,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/

相关文章:

c# - 将自定义 .NET ORM 迁移到 Entity Frame/Dapper

nhibernate - 是否可以使用 NHibernate 调用存储过程并填充数据表?

nhibernate - 在 ASP.NET 网站中实现 NHibernate 时出错

c# - HQL 子查询的意外 NULL 返回

Nhibernate - 查询没有关系的连接表

c# - 捕获用户运行的程序

c# - 如何在 Visual Studio 解决方案中查找最常用的类

c# - C# (.NET) 应用程序中的内存使用率非常高,直到我调用 System.GC.Collect()

mysql - 带条件的 Hibernate Select 查询

Hibernate - 将复合关系映射到非主键