2010-08-30 66 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