2011-08-19 35 views
10

Tôi đang cố gắng lưu (chèn) một thực thể Chánh với danh sách Các thực thể con. Cả hai entites sử dụng một Guid là khóa chính. Các khóa không có giá trị rỗng và không có mối quan hệ khóa nào được thiết lập trong db.Chèn phụ huynh và trẻ em với NHibernate cùng một lúc

Lưu không hoạt động, ngoại lệ được yêu cầu - tôi cố gắng lưu một giá trị rỗng vào khóa ngoại của Phụ huynh trong bảng Con.

Tôi đã mong đợi nhibernate để tạo ra một chìa khóa cho phụ huynh và để cho các đối tượng con của nó biết về nó. Đây có phải là hạn chế của NHibernate hoặc sử dụng Guids làm khóa chính không?

Điều này answer đề xuất bạn phải đặt chế độ người dùng gốc, đây thực sự là cách duy nhất?

Dưới đây là ánh xạ của tôi để tham khảo: lập bản đồ

phụ huynh:

HasMany(x => x.Children).KeyColumn("ParentKey").Inverse().Cascade.All(); 

lập bản đồ trẻ em:

References(x => x.Parent).Not.Nullable().Column("ParentKey"); 

Trả lời

15

NHibernate không phải là kỳ diệu. Nó chỉ là một ORM, nếu con của bạn không có tham chiếu của họ đặt cho phụ huynh, tại sao nó sẽ giả định rằng bởi vì cha mẹ có một danh sách trẻ em mà tham khảo của trẻ em, lần lượt, NÊN là một tham chiếu đến phụ huynh?

Tôi tin rằng bạn đã trả lời câu hỏi của riêng mình khi bạn tuyên bố rằng thực thể Con không có thuộc tính Gốc của chúng (có nghĩa là nó không có nghĩa là NHibernate sẽ cố gắng lưu giá trị 'null' cho id chính trong bảng con của bạn).

Nếu bạn sử dụng các đối tượng này KHÔNG NHibernate, có nghĩa là cần phải đặt tham chiếu Gốc trên các thực thể con khi chúng được thêm vào.

EDIT: Đây là trường hợp bạn đã chỉ định 'Inverse' trên ánh xạ của bạn. Nếu bạn muốn xóa cuộc gọi này tới 'Đảo ngược', nó sẽ hoạt động theo cách bạn muốn nó hoạt động như Ngược lại nói rằng đầu kia (thực thể con) chịu trách nhiệm theo dõi mối quan hệ. Điều này có nghĩa là bạn cần đặt tham chiếu của phụ huynh trên con theo cách thủ công.

Tuy nhiên, việc xóa câu lệnh Ngược lại sẽ làm cho (các) con được lưu, phụ huynh sẽ được lưu, sau đó id mẹ của (các) con sẽ được CẬP NHẬT. Vì bạn có một ràng buộc null trên id cha, điều này có nghĩa là nó vẫn không hoạt động vì ban đầu nó sẽ chèn Child với một id cha của null.

Hai giải pháp sẽ là một trong hai loại bỏ hạn chế này, hoặc chỉ cần thêm một phương pháp để Phụ Huynh gọi addChild:

public void AddChild(Child childObj) 
{ 
    childObj.Parent = this; 
    Children.Add(childObj); 
} 

Thêm một phương pháp khác gọi là removeChild:

public void RemoveChild(Child childObj) 
{ 
    if (Children.Contains(childObj)) 
    { 
     Child.Parent = null; 
     Children.Remove(childObj); 
    } 
} 

Sau đó, chỉ cần sử dụng các phương pháp đó để thêm/xóa trẻ em.

+1

Chắc chắn tôi không mong đợi tham chiếu ở đó vào thời gian chạy trước khi lưu (có lẽ câu hỏi của tôi là gây hiểu lầm, chỉnh sửa nó) - Điều tôi mong đợi là dành cho Nhibernate để biết cả Phụ huynh và Trẻ em đều mới và biết làm thế nào để tồn tại chúng với các phím thích hợp .... quá nhiều để yêu cầu? – Dan

+0

@Tôi đã cập nhật câu trả lời của mình để hữu ích hơn. – docmanhattan

+0

chỉ để giải thích thêm về ánh xạ và hạn chế kiểm tra liên kết này http://wiki.fluentnhibernate.org/Fluent_mapping#Access_strategies – cpoDesign

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