2009-02-08 7 views
19

Trong hệ thống của tôi, tôi có hai thực thể - ShoppingCart và ShoppingCartItem. Trường hợp sử dụng chung chung. Tuy nhiên, khi tôi lưu ShoppingCart của mình, không có mục nào được lưu vào DB.NHibernate: Sử dụng Fluent Nhibernate để lưu các đối tượng con

Trong đối tượng của mình, tôi tạo đối tượng ShoppingCart mới.

ShoppingCart cart = CreateOrGetCart(); 

Sau đó, tôi thêm sản phẩm hiện có mà tôi nhận được từ cơ sở dữ liệu vào đầu.

cart.AddItem(product); 

Đây chỉ là trình bao bọc đơn giản để thêm mục vào IList.

public virtual void AddItem(Product product) 
    { 
     Items.Add(new ShoppingCartItem { Quantity = 1, Product = product }); 
    } 

sau đó tôi gọi SaveOrUpdate trên Repository

Repository.SaveOrUpdate(cart); 

nào trông như thế này:

public T SaveOrUpdate(T entity) 
    { 
     Session.SaveOrUpdate(entity); 
     return entity; 
    } 

Tôi đang sử dụng thành thạo NHibernate cho lập bản đồ:

public ShoppingCartItemMap() 
    { 
     WithTable("ShoppingCartItems"); 

     Id(x => x.ID, "ShoppingCartItemId"); 
     Map(x => x.Quantity); 

     References(x => x.Cart, "ShoppingCartId").Cascade.SaveUpdate(); 
     References(x => x.Product, "ProductId"); 
    } 


    public ShoppingCartMap() 
    { 
     WithTable("ShoppingCarts"); 

     Id(x => x.ID, "ShoppingCartId"); 
     Map(x => x.Created); 
     Map(x => x.Username); 

     HasMany<ShoppingCartItem>(x => x.Items) 
      .IsInverse().Cascade.SaveUpdate() 
      .WithKeyColumn("ShoppingCartId") 
      .AsBag(); 
    } 

Lược đồ cơ sở dữ liệu (SQL Server 2005) cũng khá chung chung:

CREATE TABLE [dbo].[ShoppingCarts] 
(
[ShoppingCartID] [int] NOT NULL IDENTITY(1, 1), 
[Username] [nvarchar] (50) NOT NULL, 
[Created] [datetime] NOT NULL 
) 
GO 
ALTER TABLE [dbo].[ShoppingCarts] ADD CONSTRAINT [PK_ShoppingCarts] PRIMARY KEY CLUSTERED ([ShoppingCartID]) 
GO 



CREATE TABLE [dbo].[ShoppingCartItems] 
(
[ShoppingCartItemId] [int] NOT NULL IDENTITY(1, 1), 
[ShoppingCartId] [int] NOT NULL, 
[ProductId] [int] NOT NULL, 
[Quantity] [int] NOT NULL 
) 
GO 
ALTER TABLE [dbo].[ShoppingCartItems] ADD CONSTRAINT [PK_ShoppingCartItems] PRIMARY KEY CLUSTERED ([ShoppingCartItemId]) 
GO 
ALTER TABLE [dbo].[ShoppingCartItems] ADD CONSTRAINT [FK_ShoppingCartItems_Products] FOREIGN KEY ([ProductId]) REFERENCES [dbo].[Products] ([ProductId]) 
GO 
ALTER TABLE [dbo].[ShoppingCartItems] ADD CONSTRAINT [FK_ShoppingCartItems_ShoppingCarts] FOREIGN KEY ([ShoppingCartId]) REFERENCES [dbo].[ShoppingCarts] ([ShoppingCartID]) 
GO 

Khi tôi lưuCài đặtCửa hàng mua sắm của tôi, tại sao mọi ShoppingCartItems cũng không được lưu?

Vui lòng trợ giúp.

Cảm ơn

Bến

UPDATE: gói nó trong một giao dịch providng tôi với một số thông tin thêm:

Không thể chèn các giá trị NULL vào cột 'ShoppingCartId', bảng 'WroxPizza .dbo.ShoppingCartItems '; cột không cho phép null. INSERT không thành công. Các tuyên bố này đã bị chấm dứt.

Điều này là do đó là một giỏ hàng mới.

+0

Giải pháp của James Gregorys dành cho tôi. –

Trả lời

1

Hãy thử gói Session.SaveOrUpdate trong giao dịch hoặc thực hiện lệnh xả trực tiếp sau.

0

Tôi không chắc chắn, nhưng tôi không nghĩ rằng NHibernate thác tiết kiệm của các đối tượng cho các đối tượng con. Bạn không hiển thị mã gọi SaveOrUpdate, nhưng tôi biết nếu bạn lặp qua ShoppingCartItems tại thời điểm đó, hãy lưu từng mã riêng lẻ, sau đó chúng sẽ được lưu lại.

0

Tôi biết không có gì về NHibernate (OPF tôi sử dụng cho tôi), nhưng không phải là trường hợp khi bạn lưu gốc tổng hợp (ShoppingCart) mã đó cũng phải cam kết các trường hợp được sở hữu tương ứng với phiên quá?

0

Có thể các mặt hàng giỏ hàng của bạn đang lưu trước, sau đó là giỏ hàng? do đó các mục con không có ID cha để sử dụng?

Bạn CÓ THỂ cần phải lưu lại giỏ hàng một cách rõ ràng vào DB khi tạo, sau đó thêm các mục vào đó và lưu - chỉ để lấy ID.

2

Tại sao bạn bao gồm .Cascade.SaveUpdate() trong dòng

References(x => x.Cart, "ShoppingCartId").Cascade.SaveUpdate() 

?

Có lẽ nó gây nhầm lẫn NHibernate (hoặc Fluent NHibernate) rằng có vẻ như tầng tầng lưu/cập nhật từ cả hai đầu mối quan hệ của bạn?

Định cấu hình HasMany của bạn thành thác phải đủ để đạt được những gì bạn muốn.

3

Tôi gặp sự cố chính xác này với chế độ nhibernate thông thạo. Dường như có một lỗi nhỏ trong việc ánh xạ các mối quan hệ một-nhiều và các mối quan hệ không tự động tiết kiệm hoặc xếp tầng. See here for a posting about it on the Fluent NHibernate group.

Rõ ràng, có ai đó đang làm việc về vấn đề này!

Tôi không thể chắc chắn rằng đây là vấn đề với mã của bạn nhưng it looks very similar to a problem I had. Hy vọng rằng sẽ giúp một số!

-4

Vấn đề là với tuyên bố cấu hình của bạn về sessionfactory. Không sử dụng Exposeconfiguration nếu bạn muốn dữ liệu của mình tồn tại. Điều đó chắc chắn sẽ giải quyết vấn đề của bạn về sự kiên trì dữ liệu.

+0

sử dụng lược đồ phải được thực hiện cẩn thận. –

0

Như đã nhận thấy, bạn đã xác định (trong lược đồ cơ sở dữ liệu) trường với danh tính, do đó, các trường này phải được đặt trong tệp bản đồ. Ví dụ như sau:

Id(x => x.ID, "ShoppingCartItemId").GeneratedBy.Identity();

lỗi mà bạn đang nhận được vì bạn không thiết lập các lĩnh vực nhận dạng trong các bản đồ được tạo ra bởi nhận dạng, do đó, khi bạn đang cố gắng để tiết kiệm(), Identity cột không được tạo ra (và được đặt thành không null trong cơ sở dữ liệu) thì nó sẽ cho bạn lỗi.