2014-04-07 93 views
0

我們在我們的模型中有一個對象,稱之爲類X.在我們的模型中還有其他幾個類有一個X類的實例作爲屬性,稱它們爲A,B,C等。因爲每個X只能屬於一個父類。爲了在數據庫端映射這種關係,我們正在使用表A,B和C中X表的外鍵。對於NHibernate映射,我們目前使用A,B和C的映射類:我如何讓NHibernate刪除一對一關係中的孤兒?

ManyToOne(a => a.X, m => m.Cascade(Cascade.All)); 

這主要適用於保存,檢索和更新我們班XS - 我們已經有很多讓NHibernate的OneToOne映射到工作的權利問題。問題是,當你持有持久化類A並將其X替換爲新的X實例並保存該實例時,則新的X實例將被寫入數據庫,並且A列中的外鍵得到更新,但舊的X不會被刪除,所以我們現在有一個孤兒X.

我們希望那些孤兒Xes被自動刪除。我們希望NHibernate能夠做到這一點,因爲X是一個複雜的類,它有許多自己與其他表的關係,我們有級聯設置可以正確處理 - 我有一個SQL腳本可以正確地刪除孤兒Xes,它的大小約爲50線條很長。

我們試圖避免涉及在類X中引用其父項的解決方案,因爲總共有5個類可以屬於它,並且類A的情況有一個X,B類有2個XES在已命名的屬性等

事情我試過到目前爲止:

添加DeleteOrphansManyToOne映射 - 不工作

OneToOne映射 - 真的想關鍵是在其他表,並且似乎不支持級聯刪除反正。

也認爲:

NHibernate的似乎並不具備設立某種即使像更新的東西或刪除發生

Apparantly觸發任何支持,只有OneToManyManyToMany映射支持DeleteOrphans ,所以,我可以讓實際屬性使用某種列表或集合,並使用getter和setter來使它看起來像模型其餘部分的普通屬性。聽起來很不體面,而且可能需要在X中引用其他類。

數據庫觸發器 - 我還沒有真正檢查SQL Server觸發器是否可以用於這種方式,但它聽起來像一個非常尷尬的解決方案。

有沒有人有任何想法如何使這項工作?

回答

0

我們在這裏結束的解決方案是永遠不允許將X的新實例分配給任何保存它的類。相反,我們已經將代碼添加到設置器中,以便每當您嘗試分配X的新實例時,它實際上都會清除現有X的內容,並將它們全部替換爲新X的內容。由於所有對象包含在X中的是集合,NHibernate級聯在刪除X的舊子項目並將其替換爲新項目時​​刪除正常工作。這是一個難以理解的解決方案,但這是我們能夠想出的最不醜陋的東西。