NHibernate对名称和父对象的唯一约束失败,因为NH插入Null

NHibernate对名称和父对象的唯一约束失败,因为NH插入Null,nhibernate,nhibernate-mapping,Nhibernate,Nhibernate Mapping,我有一个目标如下 Public Class Bin Public Property Id As Integer Public Property Name As String Public Property Store As Store End Class Public Class Store Public Property Id As Integer Public Property Bins As IEnumerable(Of Bin) End Cla

我有一个目标如下

Public Class Bin

  Public Property Id As Integer

  Public Property Name As String

  Public Property Store As Store

End Class

Public Class Store

    Public Property Id As Integer

    Public Property Bins As IEnumerable(Of Bin)

End Class
我在数据库中对Bin.Name和Bin存储ID有一个唯一的约束,以确保存储中的名称是唯一的。但是,当NHibernate持久化存储时,它首先插入具有空StoreID的Bin记录,然后再执行更新以设置正确的StoreID。如果使用相同名称的Bin持久化两个存储,则这违反了唯一键,因为名称列相同,并且这两个存储的StoreID都为null

是否可以向映射中添加一些内容,以确保插入中包含正确的StoreID,而不是稍后执行更新?我们使用HiLo标识生成,因此不依赖DB生成的标识列

编辑: bin类型上存储的映射信息为

<many-to-one class="NHS.EDC.SM.Data.Entities.Store, EDCBusinessLogic.SM, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" name="Store">
  <column name="StoreID" unique-key="UniqueBinKey" />
</many-to-one>

商店里的垃圾箱是

<set access="nosetter.camelcase-underscore" cascade="all-delete-orphan" inverse="true" name="Bins" mutable="true">
  <key>
    <column name="StoreID" />
  </key>
  <one-to-many class="NHS.EDC.SM.Data.Entities.Bin, EDCBusinessLogic.SM, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" />
</set>

谢谢


James

您必须将
Bin
集合映射为反向和级联,并始终设置关系的两侧(添加到集合,并设置
Bin.Store


如中所述,请显示保存Bin对象的代码。如果按此顺序执行,请执行以下操作:

session.Save(myBin);
bin.Store = myStore;
session.Flush();

NHibernate将使用调用
Save
时对象的状态生成一个insert,并在调用
Flush
时进行更新。在刷新会话之前设置Store属性将更正此问题。

感谢您的回复,我已将我正在使用的映射添加到帖子中,但我认为基于您的理解,它是正确的你说过吗?映射看起来是正确的…我本来想问你是否设置了两边,但后来我看到了你对Jamie Ide的回答,所以我相信你是这样。链接已经失效。@user3270407 fixed是的,首先构造对象层次结构(使用适当的反向引用),然后保存聚合根(存储)