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

时间:2010-04-22 08:06:15

标签: 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 Class

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

我是否可以添加到映射中以确保INSERT中包含正确的StoreID而不是稍后执行更新?我们正在使用HiLo身份生成,因此我们不依赖于数据库生成的标识列

编辑: 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>

由于

詹姆斯

2 个答案:

答案 0 :(得分:1)

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

6.4. One-To-Many Associations6.8. Bidirectional Associations

中对此进行了描述

答案 1 :(得分:0)

请显示保存Bin对象的代码。如果您按此顺序执行此操作:

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

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