2012-10-02 188 views
3

假設我有一個Foo類。我也有一個名爲Foo_Foo的Foo上的視圖,它列出了Foos之間的多對多關聯。我映射了該協會爲每個美孚簡單不變集,具備級聯=「無」:NHibernate防止級聯刪除

<set name="association" table="Foo_Foo" cascade="none" mutable="false"> 
    <key column="ParentFoo" /> 
    <many-to-many class="Foo, MyAssembly" column="BaseFoo" /> 
</set> 

然而,當我嘗試刪除一個Foo,NHibernate的嘗試是正確無法刪除Foo.association。

如何防止NHibernate嘗試刪除關聯到視圖?

回答

2

該集合屬於Foo。您無法共享該集合,因此無需將其保存在數據庫中。 Cascade用於告訴NH是否應刪除引用的Foo

爲什麼要將Foo_Foo記錄保存在數據庫中?如果這應該是一個雙向的多對多自引用,它不會像這樣工作。


編輯,理解後的問題。

級聯在您的情況下不起作用,因爲它隻影響引用的Foos。

爲了避免採集表的插入/更新和刪除,您可以嘗試下列之一:

  • 第一個明顯的企圖是mutable="false",你已經嘗試過。我不明白爲什麼它不起作用。您可以在Nhibernate用戶組中詢問。
  • 不太明顯,但有前途的是inverse="true"。反向告訴NH,集合被映射到其他地方並且不需要從這裏存儲。所以它只是省略了插入,但我不知道刪除。
  • 如果這不起作用,您需要探索更復雜的解決方案。您可以將其映射爲參考Foos的一對多中間實體。中間實體是對視圖的映射。它是不可變的(這仍然可能導致刪除語句)。在這種情況下,cascade="false"將起作用(因爲它是被引用的實體)。它也將工作配置插入,更新和刪除SQL語句(這是空的),但這很可能不是必要的。
+0

Foo_Foo不包含記錄,它是Foo表上的* view *。 Foos之間的關係是通過NHibernate之外的一些方法計算出來的,並在這個視圖中表示(它們不是通過外鍵表示)。這個視圖不應該接收保存/更新/刪除級聯,因爲我已經在映射文件中指定了,但是NHibernate試圖從這個視圖中刪除。我在問如何阻止這一點。 – naasking

+0

現在我明白了。我仔細想想。當然有一個解決方案。 –

+0

那麼還有什麼想法嗎? – naasking