我正在尝试删除对象的层次结构:
customer-> orders-> orderItems-> orderIteMoptions
我设置了一个直接的嵌套循环,甚至试图在"正确"订单中进行操作,因为必须在数据库中完成 - 在删除父级之前先删除子记录。
。这是循环:
deleteCustomer(customer: Customer): Promise<void> {
return this.getCustomerOrderHistory(customer.id).then(orders => {
orders.forEach(o => {
o.items.forEach(oi => {
oi.options.forEach(opt => opt.entityAspect.setDeleted());
oi.entityAspect.setDeleted();
});
o.entityAspect.setDeleted();
});
customer.entityAspect.setDeleted();
});
}
问题是,当每个级别的父对象setDeleted()时,将标记为"修改为"修改"的重复实体记录添加到EntityManager缓冲的更改中。然后,当我调用savechanges asp.net/ef后端会引发异常,因为到与那些修改后的记录相对应的更新语句被执行时,删除已经发生,因此更新失败了,没有找到fk的例外。<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<</p>
所以我在这里缺少什么?
这是一个经典的案例,即在其上迭代时修改数组。当我们删除这样的孩子时:
o.items.forEach(oi => {
oi.entityAspect.setDeleted();
});
…每次我们致电setDeleted
时,都会从父级items
集合中删除子实体,这是迭代的集合。因此,下一个迭代跳过了两者之间的实体,实际上仅设置了大约一半的实体。
症状将是一个保存串,其中包含删除和修改的实体的混合物,并且(如果您删除了父实体),则在尝试删除父母而不删除所有所有内容时,数据库违反了数据库。孩子。
简单的解决方案是在迭代之前制作阵列的副本,例如使用slice
:
o.items.slice().forEach(oi => {
oi.entityAspect.setDeleted();
});