2011-10-12 348 views
1

如何映射具體類的集合屬性,而不是接口? 它必須是具體的課程!我無法控制要映射的類,所以我無法更改爲接口。nhibernate自定義集合映射

現在我試圖通過編寫自定義IUserCollectionType實現和自定義IPersistentCollection實現來解決此問題。

但是...以下異常停止畝進展:

Test method ShouldSaveEntityWithSections threw exception: 
NHibernate.StaleStateException: Batch update returned unexpected row count from update; actual row count: 0; expected: 1 

探查表明,NHibernate的不嘗試插入相關實體到數據庫中,但嘗試更新它的外鍵的父對象。

的映射是這樣的:

<set name="Rows" table="Rows" lazy="false" cascade="all" 
    collection-type="My.PersistentListType`1[Blabla.Row, Blabla], My"> 
    <key column="ParentID" not-null="true" /> 
    <one-to-many class="Blabla.Row, Blabla" /> 
</set> 

這是怎麼回事?爲什麼不NHibernate插入子實體到數據庫?

+0

你能告訴我們IUserCollectionType和IPersistentCollection實現嗎?很可能有問題 – Firo

+0

不,問題在測試中。集合元素類型(在我的例子中是'Blabla.Row')沒有默認的構造函數。相反,它有一個接受幾個參數的參數之一,其中一個是用作主鍵值的「Guid」。我錯誤地通過了'Guid.NewGuid()'作爲一個值,導致NHibernate認爲該對象已經存在。 –

+1

考慮發佈該答案並接受它 – Firo

回答

1

回答我自己的問題。希望它能幫助遇到同樣問題的人。

該人應該檢查他\她不創建一個相關的對象在一個狀態,這導致NHibernate認爲它已經持續。

在我的情況下,我錯誤地將映射爲主鍵的屬性設置爲Guid.NewGuid()而不是Guid.Empty