我有一个如下对象
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>
由于
詹姆斯
答案 0 :(得分:1)
您必须将Bins
集合映射为反向和级联,并始终设置关系的两侧(添加到集合,并设置Bin.Store
。
6.4. One-To-Many Associations和6.8. Bidirectional Associations
中对此进行了描述答案 1 :(得分:0)
请显示保存Bin对象的代码。如果您按此顺序执行此操作:
session.Save(myBin);
bin.Store = myStore;
session.Flush();
NHibernate将在调用Save
时使用对象的状态生成插入,并在调用Flush
时进行更新。在刷新会话之前设置Store属性将更正此问题。