2010-08-30 67 views
0

我在刪除對象時遇到了一些問題。我收到以下錯誤:使用nhibernate刪除對象的問題

[Test.Item#ab9a9869-b2c1-4262-8d33-9dd9010abd96][SQL: DELETE FROM InvoerItem WHERE DbId = ? AND Version = ?]

The DELETE statement conflicted with the REFERENCE constraint "FK9100B9F130A0A610". The conflict occurred in database "", table "dbo.InvoerItemToInvoerItem", column 'Listener_id'.

的情況是這樣的我有一個具有同一類這些被稱爲listerners的其他對象的引用的集合的對象。

爲對象的映射是這樣的:

public InvoerItemMap() 
{ 
    HasManyToMany(x => x.Listeners) 
     .ChildKeyColumn("Listener_id") 
     .Cascade.None() 
     .Access.CamelCaseField(Prefix.Underscore); 
} 

這是什麼刪除具有連接到它的聽衆對象時導致異常?我是否必須反轉聽衆的關係?

+0

誰在這裏沒有評論的投票? – 2010-08-30 07:45:21

回答

0

不,倒不對。

你需要指定你想要對聽衆做什麼。基本上有兩種選擇:

  • 告訴身邊有聽衆在用戶和他不能刪除此對象
  • 註銷該軟件的聽衆。

如果您決定取消註冊監聽者,那麼......只是實施它。

InvoerItem itemToDelete = ...; 
itemToDelete.Listeners.Clear(); 
session.Delete(itemToDelete); 

它甚至會更好地讓實體管理聽衆:

itemToDelete.UnregisterListeners(); 

編輯:如果你從聽衆到invoerItems引用,您需要將其刪除,以及:

public void UnregisterListeners() 
{ 
    foreach(Listener listener in Listeners) 
    { 
     listener.Invoeritem = null; 
    } 
    Listeners.Clear(); 
} 

順便說一句:在這種情況下,你應該使聽衆INVERS即不要忘記將它映射到相同的外鍵。

+0

感謝您的意見 我做了上述,但我仍然得到同樣的錯誤。我添加了一個名爲Unregister的方法,並在那裏清除了列表。我必須調整地圖或其他東西嗎? – Wombat 2010-08-30 08:09:34

+0

是否有從偵聽器到InvoerItems的引用?然後你需要刪除它們。 – 2010-08-30 09:03:03

+0

存在循環引用。但我不能刪除它,因爲然後我得到一個stackoverflow異常。 – Wombat 2010-08-30 10:06:36