我有一个新对象,其中一些属性中包含一些新对象作为IList。我通过sql profiler看到两个插入查询正在执行..一个用于父级,具有新的guid id,另一个用于子级,但是,引用父级的子级上的外键是空guid。这是我在父母身上的映射:
<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 唯一标识符 '@ P0 = N'qaa',@ P1 = 'BC95E7EB-5EE8-44B2-82FF30F5176684D',@ P2 = N'qaa”,@ P3 = '18FBF8CE-FD22-4D08-A3B1-63D6DFF426E5'
exec sp_executesql N'INSERT INTO BackerEntry(BackerId,BackerEntryTypeId,Name,Description,MaxLength,IsRequired,Priority,BackerEntryId)VALUES(@ 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'
正如你所看到的,它没有将孩子的BackerId的空guid重置为父母的新真实guid。
最后,异常抛出是:
"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时,有一个脱节,所以我不得不想出一些古怪的代码来“重新附加”孩子。
答案 0 :(得分:9)
您可能需要在映射类中添加NOT-NULL =“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"/>
我在当前具有父子关系的项目中遇到了与hibernate类似的问题,这是解决方案的一部分。
答案 1 :(得分:0)
我遇到了这个问题,我花了很长时间才弄明白。 Child表必须允许其父外键使用空值。 NHibernate喜欢在外键列中保存带有NULL的子节点,然后返回并使用正确的ParentId进行更新。