setDeleted循环导致SaveChanges调用中的修改实体



我正在尝试删除对象的层次结构:

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();
    });

最新更新