2008-09-28 30 views
8

Tôi có một đối tượng mới với một tập hợp các đối tượng mới bên trong nó trên một số tài sản như là một IList. Tôi thấy thông qua sql profiler hai truy vấn chèn đang được thực hiện .. một cho cha mẹ, trong đó có id guid mới, và một cho trẻ em, tuy nhiên, các khóa nước ngoài trên con tham chiếu đến phụ huynh, là một guid trống. Dưới đây là bản đồ của tôi trên phụ huynh:Tại sao bộ sưu tập túi NHibernate của tôi không đặt 'id cha' của trẻ em một cách linh hoạt?

<id name="BackerId"> 
    <generator class="guid" /> 
</id> 
<property name="Name" /> 
<property name="PostCardSizeId" /> 
<property name="ItemNumber" /> 

<bag name="BackerEntries" table="BackerEntry" cascade="all" lazy="false" order-by="Priority"> 
    <key column="BackerId" /> 
    <one-to-many class="BackerEntry" /> 
</bag> 

Trên lớp Backer.cs, tôi đã xác định tài sản BackerEntries như

IList<BackerEntry> 

Khi tôi cố gắng SaveOrUpdate thông qua tại đơn vị tôi nhận được kết quả như sau trong sql profiler:

exec sp_executesql N'INSERT INTO Backer (Tên, PostCardSizeId, ItemNumber, BackerId) GIÁ TRỊ (@ p0, @ p1, @ p2, @ p3) ', N' @ p0 nvarchar (3), @ p1 uniqueidentifier , @ p2 nvarchar (3), @ p3 uniqueidentifier ', @ p0 = N'qaa', @ p1 = 'BC95E7EB-5EE8-44B2-82FF3 0F5176684D '@ p2 = N'qaa', @ p3 = '18FBF8CE-FD22-4D08-A3B1-63D6DFF426E5'

exec sp_executesql N'INSERT VÀO BackerEntry (BackerId, BackerEntryTypeId, Tên, Mô tả, maxlength, isRequired, ưu tiên , BackerEntryId) GIÁ TRỊ (@ p0, @ p1, @ p2, @ p3, @ p4, @ p5, @ p6, @ p7) ', N' @ p0 uniqueidentifier, @ p1 uniqueidentifier, @ p2 nvarchar (5), @ p3 nvarchar (5), @ p4 int, @ p5 bit, @ p6 int, @ p7 uniqueidentifier ', @ p0 =' 00000000-0000-0000-0000-000000000000 ', @ p1 =' 2C5BDD33-5DD3-42EC-AA0E-F1E548A5F6E4 ', @ p2 = N'qaadf', @ p3 = N'wasdf ', @ p4 = 0, @ p5 = 1, @ p6 = 0, @ p7 =' FE9C4A35-6211-4E17-A75A-60CCB526F1CA '

Như bạn thấy, nó không đặt lại các guid trống cho BackerId trên đứa trẻ để các hướng dẫn thực sự mới của phụ huynh.

Cuối cùng, ném ngoại lệ là:

"NHibernate.Exceptions.GenericADOException: could not insert: [CB.ThePostcardCompany.MiddleTier.BackerEntry][SQL: INSERT INTO BackerEntry (BackerId, BackerEntryTypeId, Name, Description, MaxLength, IsRequired, Priority, BackerEntryId) VALUES (?, ?, ?, ?, ?, ?, ?, ?)] ---\u003e System.Data.SqlClient.SqlException: The INSERT statement conflicted with the FOREIGN KEY constraint 

EDIT: SOLVED! Câu trả lời đầu tiên bên dưới chỉ tôi vào đúng hướng. Tôi cần phải thêm tham chiếu ngược đó vào ánh xạ và lớp con. Điều này cho phép nó làm việc một cách thuần túy .net - tuy nhiên, khi chấp nhận json, đã có một ngắt kết nối vì vậy tôi đã phải đưa ra một số mã kỳ quặc để 'đính kèm lại' các em.

Trả lời

9

Bạn có thể cần phải thêm KHÔNG-NULL = "true" để lớp bản đồ của bạn:

<bag name="BackerEntries" table="BackerEntry" cascade="all" lazy="false" order-by="Priority"> 
    <key column="BackerId" not-null="true"/> 
    <one-to-many class="BackerEntry" /> 
</bag> 

cũng như đảm bảo rằng bạn có sự đảo ngược của ánh xạ được định nghĩa cho lớp trẻ:

<many-to-one name="parent" column="PARENT_ID" not-null="true"/> 

Tôi có vấn đề tương tự với hibernate trên dự án hiện tại của tôi với các mối quan hệ cha-con, và đây là một phần của giải pháp.

+0

Cảm ơn bạn .. Bạn đã chỉ cho tôi đúng hướng ... Tôi không có tham chiếu ngược trong bản đồ con của tôi. – EvilSyn

0

Tôi gặp sự cố này và tôi đã mất rất nhiều thời gian để tìm hiểu. Bảng con phải cho phép null trên khóa ngoại của mẹ. NHibernate thích lưu trẻ em bằng NULL trong cột khóa ngoài và sau đó quay lại và cập nhật với ParentId chính xác.

+1

Đây có phải là sự thật không ??? – Dan

+1

chắc chắn không đúng, bạn cần ánh xạ một liên kết hai chiều sao cho đầu nghịch đảo là thuộc tính gốc và đặt thuộc tính ở cả hai bên. http://www.nhforge.org/doc/nh/en/index.html#collections-bidirectional – dotjoe

+0

+1. Đúng vậy đây là sự thật. Cột FK trong bảng con phải có giá trị rỗng để làm việc này.NHibernate thêm các con với ParentID thiết lập để NULL và sau đó cập nhật ParentID khi cha mẹ thực sự được lưu vào cơ sở dữ liệu. –

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