使用nhibernate删除对象时出现问题

时间:2010-08-30 07:27:08

标签: c# nhibernate

删除对象时遇到一些问题。我收到以下错误:

  

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

     

DELETE语句与REFERENCE约束“FK9100B9F130A0A610”冲突。冲突发生在数据库“”,表“dbo.InvoerItemToInvoerItem”,列'Listener_id'。

情况是这样的,我有一个对象,其中包含对同类其他对象的引用集合,这些对象称为listerners。

对象的映射如下所示:

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

删除连接了侦听器的对象时,导致异常的是什么?我是否必须反转听众的关系?

1 个答案:

答案 0 :(得分: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();
}

顺便说一下:在这种情况下,你使听众反向。不要忘记将它映射到同一个外键。