保存更改失败后,删除实体框架中的待处理插入

时间:2018-04-10 03:16:52

标签: c# entity-framework

我正在进行大约50个左右记录的批量插入。它添加了所有记录和trys,以便一次性保存它们。

foreach(var item in MyItemsToSave)
{
   context.MyItems.Add(item);
}
context.SaveChantes();

如果失败,我想逐个添加它们。我有一些其他逻辑来处理失败,但我不想丢失49条有效记录,因为一个失败。我尝试了以下代码:

foreach(var item in MyItemsToSave)
{
    context.MyItems.Add(item);
    try{
        context.SaveChanges();
    }
    catch(Exception e)
    {
      .......do something
    }
}

这两段代码都在同一个进程中运行。第一部分作为最佳情况运行,然后第二部分运行,如果第一部分代码失败。我确定的是代码的批处理部分中的项目仍在等待插入。因此,当我调用savechanges方法时,它仍然试图保存坏记录。

如何删除失败的记录(或所有记录并重新开始)?

编辑说明: 即使第二次出现它仍然会失败,因为一旦错误的记录进入列表,它将尝试在您尝试循环的下一次迭代时插入它。

1 个答案:

答案 0 :(得分:0)

最好一个一个地保存更改。

foreach(var item in MyItemsToSave)
{

    try{
        context.MyItems.Add(item);
        context.SaveChanges();
    }
    catch(Exception e)
    {
       while (item.<FKColl>.Count > 0)
       {
           context.Detach(item.<FKColl>.First());
       }
      context.Detach(item);
    }
}

如果有任何失败,请使用Detach从上下文中删除该项目(NOT IN DATASOURCE)。您还应该在分离item

之前删除fk项目