2010-04-22 63 views
0

我有一個對象如下NHibernate的唯一約束名稱和父對象失敗,因爲NH插入空

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爲兩者都爲空。

有什麼我可以添加到映射,以確保正確的StoreID包含在INSERT中,而不是稍後執行更新?我們使用的希洛身份生成,所以我們不是靠DB生成的標識列

編輯:用於對倉位類型的商店 映射信息

<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> 

感謝

詹姆斯

回答

1

您必須將Bins集合映射爲反轉和級聯,並始終設置關係的兩側(添加到集合,並設置Bin.Store

這在6.4. One-To-Many Associations描述和6.8. Bidirectional Associations

+0

感謝您的回覆,我已經添加了我正在使用的貼圖,但我認爲這是正確的,基於你所說的? – James 2010-04-27 09:38:02

+0

映射看起來是正確的......我要問你是否設置了雙方,但是我看到了你對傑米·艾德的回答,所以我相信你是。 – 2010-04-27 10:45:38

+0

鏈接已死。 – 2016-07-05 20:38:56

0

請出示被保存斌對象的代碼。如果你正在做的順序是:

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

NHibernate的將當時使用Save被稱爲和更新對象的狀態時Flush被稱爲生成插入。在刷新會話之前設置Store屬性將更正此問題。

+0

是的,首先構造對象層次結構(帶有適當的反向引用),然後聚合根(store)的onyl被保存 – James 2010-04-27 09:39:02