c# - HasManyToMany Fluent NHibernate 映射删除错误

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

我一直在对一个我称为 Task 的实体进行多对多映射。一个任务可以有很多 child 和很多 parent 。中间有一个连接表,只有两个 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 约束问题。有什么方法可以映射它,以便我可以删除任何一方的实体,子实体或父实体,而不会出现此异常?我在我的映射的两边都尝试了反转,但这只是导致我的多对多关系没有得到保存。 >_<

如有任何帮助,我们将不胜感激。

最佳答案

你必须手动删除它们

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

关于c# - HasManyToMany Fluent NHibernate 映射删除错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9474368/

相关文章:

nhibernate - 批量插入期间 Fluent NHibernate 命令超时

fluent-nhibernate - 映射枚举列表

nhibernate - Fluent NHibernate Syscache2 缓存过期

c# - 泛型方法可能会抛出异常

NHibernate FlushMode 在查找前自动不刷新

c# - 如何在控制台程序中接收参数?

mysql - 在 Nhibernate 中订购一个像数字一样的字符串

nhibernate - 如何停止 Fluently.Configure 自动连接

c# - 将 MSDN 示例从 C# 转换为 C++/CLI

c# - 无法在列表中创建文件夹