8

我有一个新对象,其中包含作为 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 uniqueidentifier',@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 时,会出现断开连接,所以我不得不想出一些古怪的代码来“重新连接”孩子。

4

2 回答 2

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

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

于 2008-09-28T20:20:44.037 回答
0

我遇到了这个问题,我花了很长时间才弄清楚。Child 表必须在其父外键上允许空值。NHibernate 喜欢在外键列中使用 NULL 保存子项,然后返回并使用正确的 ParentId 进行更新。

于 2010-11-17T14:25:00.000 回答