我一直在研究一个名为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;
非常感谢任何帮助。
答案 0 :(得分:3)
你必须手动删除它们
void Delete(Task task)
{
foreach (var parent in task.Parents)
{
parent.Childs.Remove(task);
}
session.Delete(task);
}