为什么不是我的NHibernate包集合动态地设置孩子的“父ID”?

问题描述:

我有一个新的对象,其中有一些属性为IList的新对象的集合。我看到通过sql profiler两个插入查询正在执行..一个为父,其中有一个新的GUID ID和一个孩子,但是,引用父母的子外键,是一个空的GUID。这是我在父映射:为什么不是我的NHibernate包集合动态地设置孩子的“父ID”?

<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> 

在Backer.cs类,我定义BackerEntries财产

IList<BackerEntry> 

当我尝试SaveOrUpdate在实体传递,我得到的SQL如下结果profiler:

exec sp_executesql N'INSERT INTO Backer(Name,PostCardSizeId,ItemNumber,BackerId)VALUES(@ 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 INTO BackerEntry(BackerId,BackerEntryTypeId,名称,说明,的MaxLength,IsRequired,优先级,BackerEntryId)VALUES(@ p0,@ p1,@ p2,@ p3,@ p4,@ p5,@ p6,@ p7)',N'@ p0 uniqueidentifier,@ p1 uniqueidentifier,@ p2 nvarchar(5),@ p3 nvarchar(5),@ p4 int,@ p5位,@ 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'

正如你所看到的,它不会将孩子上的BackerId的空导向重置为父母的新真实导向。

最后,异常抛出是:

"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 

编辑:解决了!下面的第一个答案指出我正确的方向。我需要在子映射和类上添加回参考。这使得它能够以纯粹的.net方式工作 - 但是,当接受json时,出现了断开连接的情况,所以我不得不想出一些古怪的代码来“重新连接”孩子。

您可能需要添加非空=“true”以你映射类:

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

以及确保您有子类中定义的映射反向:

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

我在当前有父子关系的项目上遇到类似的问题,这是解决方案的一部分。

+0

谢谢..你指出我在正确的方向......我没有在我的孩子映射中的反向引用。 – EvilSyn 2008-09-28 22:43:19

我有这个问题,它花了我一直想弄清楚。 子表必须允许它的父外键上的空值。 NHibernate喜欢在外键列中保存NULL的子元素,然后返回并用正确的ParentId更新。

+1

这是真的吗? – Dan 2011-08-19 12:45:46