当前位置:  开发笔记 > 前端 > 正文

为什么我的NHibernate包集合没有动态设置子节点的"父ID"?

如何解决《为什么我的NHibernate包集合没有动态设置子节点的"父ID"?》经验,为你挑选了1个好方法。

我有一个新对象,在一些属性中有一个新对象集合作为IList.我通过sql profiler看到两个插入查询正在执行..一个用于父级,具有新的guid id,另一个用于子级,但是,引用父级的子级上的外键是空guid.这是我在父母身上的映射:


  






  
  
 

在Backer.cs类中,我将BackerEntries属性定义为

IList

当我尝试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时,有一个断开连接,所以我不得不想出一些古怪的代码来"重新附加"孩子们.



1> Elie..:

您可能需要在映射类中添加NOT-NULL ="true":


  
  

并确保您具有为子类定义的映射的反转:


我在当前具有父子关系的项目中遇到了与hibernate类似的问题,这是解决方案的一部分.

推荐阅读
牛尾巴2010
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有