2012-06-08 24 views
7

Tôi đang thực hiện một số thử nghiệm bằng NHibernate và hiện tại tôi có hai thực thể được ánh xạ, Đơn đặt hàngSản phẩm. Như mọi khi một tự có một bộ sưu tập của Sản phẩm, và tôi đang lập bản đồ này như:Tại sao NHibernate xóa và tạo lại tất cả các liên kết trong một bộ sưu tập khi tôi thêm một mục vào nó?

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

Và trên C# bên:

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

Trong trường hợp tôi đã một tồn Đặt hàng (thứ tự của John) trong cơ sở dữ liệu với một số mặt hàng trong số Sản phẩm bộ sưu tập (quả táo, cam và dừa) và tôi cố thêm một mục mới vào bộ sưu tập (quả chuối). t mũ NHibernate đang làm một cái gì đó như thế này:

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) 

Thay vì chỉ đơn giản là làm một cái gì đó như thế này:

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) 

Vậy tại sao NHibernate xóa tất cả các hiệp hội từ Sản phẩm bảng để tái tạo chúng một lần nữa khi tôi m chỉ cố gắng để chèn một sản phẩm mới trong đó? Làm thế nào để tránh nó?

Cảm ơn trước!

PS: Tôi đã cố gắng sử dụng thuộc tính ánh xạ nghịch đảo như được đề xuất trong SO Question nhưng mặc dù sản phẩm mới được lưu liên kết với đơn đặt hàng không.

EDIT:

Đây là mã tôi đang sử dụng để thay đổi các sản phẩm danh sách:

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

Bạn có thể hiển thị mã để sửa đổi danh sách sản phẩm – dotjoe

+0

Xin chào, tôi đã chỉnh sửa câu hỏi của mình để bao gồm mã tôi đang sử dụng để sửa đổi danh sách sản phẩm như bạn đã đề xuất. –

Trả lời

5

Có đã là một câu hỏi tương tự trên SO: NHibernate Many-To-Many Is Deleting All Associations Before Inserting

Từ NHibernate documentation:

Túi là trường hợp xấu nhất. Vì túi cho phép các giá trị phần tử trùng lặp và không có cột chỉ mục, không thể xác định khóa chính nào. NHibernate có không có cách nào để phân biệt giữa các hàng trùng lặp. NHibernate giải quyết vấn đề này bằng cách xóa hoàn toàn (trong một DELETE) và tạo lại bộ sưu tập bất cứ khi nào thay đổi. Điều này có thể rất không hiệu quả.

+0

Cảm ơn câu trả lời của bạn và tôi xin lỗi vì không thể tự mình tìm ra câu hỏi tương tự. Bây giờ tôi chuyển bản đồ của tôi thành một ** idbag ** thay vì một túi ** và mọi thứ đang hoạt động như một sự quyến rũ! –

Các vấn đề liên quan