HasManyToMany Fluent NHibernate映射删除错误

时间:2012-02-28 00:03:20

标签: c# nhibernate fluent-nhibernate many-to-many

我一直在研究一个名为Task的实体上的多对多映射。任务可以有很多孩子和许多父母。在它们之间有一个连接表,它只有两个FK列“ParentTaskId”和“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约束问题。有没有办法映射这个,以便我可以删除任何一方,子或父,但没有此异常的实体?我在映射的两边都尝试了反向,但这导致我的多对多关系没有得到保存。 &GT; _&LT;

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

你必须手动删除它们

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