我有一个新对象,其中包含一些作为 IList 属性的新对象的集合。我通过sql探查器看到正在执行两个插入查询。一个用于父级,它具有新的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(名称,PostCardSizeId,ItemNumber,BackerId)值(@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、名称、描述、MaxLength、IsRequired、优先级、BackerEntryId)值(@p0、@p1、@p2、@p3、@p4、@p5、@p6、@p7) ',N'@p0 唯一标识符,@p1 唯一标识符,@p2 nvarchar(5),@p3 nvarchar(5),@p4 int,@p5 位,@p6 int,@p7 唯一标识符',@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 时,出现了断开连接,所以我不得不想出一些奇怪的代码来“重新附加”孩子。