HasManyToMany Fluent NHibernate映射删除错误

本文关键字:删除 错误 映射 NHibernate Fluent HasManyToMany | 更新日期: 2023-09-27 18:26:02

我一直在为一个名为Task的实体进行多对多映射。一项任务可能有许多孩子和许多父母。中间有一个联接表,只有两个FK列"ParentTaskId"answers"ChildTaskId"。以下是我到目前为止的想法。

        // Many-to-Many Parents
        HasManyToMany<Task>(x => x.Parents)
            .Table("TaskDependency")
            .ParentKeyColumn("ParentTaskId")
            .ChildKeyColumn("ChildTaskId")
            .Inverse()
            .Not.LazyLoad()
            .Cascade.SaveUpdate();
        // Many-to-Many Children
        HasManyToMany<Task>(x => x.Children)
            .Table("TaskDependency")
            .ParentKeyColumn("ChildTaskId")
            .ChildKeyColumn("ParentTaskId")
            .Not.LazyLoad()
            .Cascade.SaveUpdate();

这里有一些示例代码来帮助我说明我的问题。以下代码有效:

        _taskRepository.Save(_taskVendor);
        _taskRepository.Save(_taskClientVendor);
        _taskRepository.Save(_taskClient);
        _taskVendor.Children.Add(_taskClientVendor);
        _taskClientVendor.Children.Add(_taskClient);
        _taskRepository.Save(_taskVendor);
        _taskRepository.Save(_taskClientVendor);
        _taskRepository.Delete(_taskVendor);
        _taskRepository.Delete(_taskClientVendor);
        _taskRepository.Delete(_taskClient);

但是,如果我将删除语句的顺序更改为:

        _taskRepository.Delete(_taskVendor);
        _taskRepository.Delete(_taskClient);
        _taskRepository.Delete(_taskClientVendor);

我在我的多对多联接表上得到了fk约束冲突。我认为这与我在映射上反向设置的方式有关。它影响查询的执行顺序,以避免这种确切的fk约束问题。有没有任何方法可以映射它,这样我就可以删除任何一侧的实体,子实体或父实体,而不会出现此异常?我在映射的两侧都尝试了反向,但这只会导致我的多对多关系没有得到保存。>_<

任何帮助都将不胜感激。

HasManyToMany Fluent NHibernate映射删除错误

您必须手动删除它们

void Delete(Task task)
{
    foreach (var parent in task.Parents)
    {
        parent.Childs.Remove(task);
    }
    session.Delete(task);
}