在循环中处理SaveChanges异常

时间:2009-10-08 13:35:52

标签: 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();

}

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

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

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

思考?我做错了吗?

编辑:

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

1 个答案:

答案 0 :(得分:4)

像往常一样,我在询问某人后的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();
    }

}