2012-06-08 25 views
7

我正在做一些測試使用NHibernate和我目前有兩個映射實體,訂單產品。一如往常的訂單產品的集合,而我映射此爲:爲什麼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的從產品刪除所有關聯表時,我再重新創建它們只試圖插入一個新產品?如何避免它?

在此先感謝!我試圖用inverse映射屬性來建立這個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(); 
} 
+0

您可以顯示修改產品列表 – dotjoe

+0

嗨的代碼,我編輯我的問題,包括我使用的是如你所說修改產品列表的代碼。 –

回答

5

有已經在SO類似的問題:NHibernate Many-To-Many Is Deleting All Associations Before Inserting

從NHibernate的documentation

手提袋是最糟糕的情況。由於袋子允許重複元素值 並且沒有索引列,所以可以定義主鍵。 NHibernate有 無法區分重複的行。 NHibernate通過徹底刪除(在單個DELETE中)和 重新創建集合,每當它發生更改時,解決此問題 。這可能是非常低效的。

+0

感謝您的回答,我很抱歉無法自己找到類似的問題。現在,我將我的地圖轉換爲** idbag **而不是**包**,一切都像魅力一樣工作! –

相關問題