在循环中处理 SaveChanges 异常

Moo*_*Moo 4 c# entity-framework

在实体框架中,有一些条件在数据库级别处理,并作为 Context.SaveChanges() 上的异常传递回 EF。

如果您在循环中创建新实体,您可以通过标准的“Try Catch”块处理异常,但如何从 SaveChanges() 队列中清除有问题的实体?

例如(将 SaveChanges 移到循环之外没有任何积极影响,因此它在循环内显示在此处):

while(i < 1000)
{
    MyEntity Wibble = new MyEntity();
    Wibble.Name = "Test " + i.ToString();

    Context.AddToTests(Wibble);
    Context.SaveChanges();

}
Run Code Online (Sandbox Code Playgroud)

如果由于某种原因,已经存在导致插入在数据库中的唯一约束上失败的 Wibble,我可以处理循环中的立即异常。

然而,它在下一次迭代中再次失败,因为有问题的 Wibble 实例仍然存在于 SaveChanges 队列中——你应该如何处理这个问题?

您当然可以事先检查我们是否正在创建重复的 Wibble,但这会导致到数据库的两次往返。我不介意处理异常,我只是想知道这个问题,忽略该记录并继续前进。

想法?我这样做错了吗?

编辑:

我已经解决了眼前的问题,但仅限于在循环中执行 Context.SaveChanges() 时。如果您只在循环结束之外调用 SaveChanges() 一次,则我的解决方案不起作用 - 任何人都可以提出一种可行的替代方法吗?

Moo*_*Moo 5

像往常一样,我在询问某人后 15 分钟内解决了它:)

解决办法是在处理异常时从ObjectStateManager中删除实体对象,这样循环才能继续:

while(i < 1000)
{
    MyEntity Wibble = new MyEntity();
    Wibble.Name = "Test " + i.ToString();

    Context.AddToTests(Wibble);

    try
    {
        Context.SaveChanges();
    }
    catch
    {
        Context.ObjectStateManager.GetObjectStateEntry(Wibble).Delete();
    }

}
Run Code Online (Sandbox Code Playgroud)