Tho*_*ena 7 c# nhibernate nhibernate-mapping
我正在使用NHibernate进行一些测试,我目前有两个映射实体,Orders和Products.一如既往,Order有一系列产品,我将其映射为:
<bag name="Products" cascade="all" lazy="true">
<key column ="Order_ID" />
<many-to-many class="Product" column="Product_ID" />
</bag>
Run Code Online (Sandbox Code Playgroud)
在C#方面:
public virtual IList<Product> Products
{
get { return _Products; }
set { _Products = value; }
}
private IList<Product> _Products = new List<Product>();
Run Code Online (Sandbox Code Playgroud)
如果我在数据库中有一个持久订单(约翰的订单),其产品集合中有一些项目(苹果,橙子和椰子),我尝试在集合中添加一个新项目(香蕉)我可以看到从NHibernate做的事情的SQL输出:
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)
Run Code Online (Sandbox Code Playgroud)
而不是简单地做这样的事情:
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)
Run Code Online (Sandbox Code Playgroud)
那么为什么NHibernate会删除Products表中的所有关联,以便在我只是尝试在其中插入新产品时再次重新创建它们?怎么避免呢?
提前致谢!
PS:我尝试使用此SO问题中建议的逆映射属性,但即使新产品得到保存,它与订单的关联也不会.
编辑:
这是我用来修改产品列表的代码:
Order order = session.Load<Order>(orderId);
order.Products.Add(new Product() { Name = "Banana" });
using (ITransaction transaction = session.BeginTransaction())
{
session.Update(order);
transaction.Commit();
}
Run Code Online (Sandbox Code Playgroud)
在SO上已经存在类似的问题:NHibernate多对多在插入之前删除所有关联
来自NHibernate的文档:
手袋是最糟糕的情况.由于包允许重复的元素值并且没有索引列,因此不能定义主键.NHibernate无法区分重复的行.NHibernate通过完全删除(在单个DELETE中)并在每次更改时重新创建集合来解决此问题.这可能效率很低.