代码之家  ›  专栏  ›  技术社区  ›  Moo

在循环中处理SaveChanges异常

  •  3
  • Moo  · 技术社区  · 15 年前

    在实体框架中,有一些条件是在数据库级别处理的,并作为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 回复  |  直到 15 年前
        1
  •  4
  •   Moo    15 年前

    像往常一样,我在问别人15分钟内就解决了。)

    解决方案是在处理异常时从ObjectStateManager中删除Entity对象,这允许循环继续:

    while(i < 1000)
    {
        MyEntity Wibble = new MyEntity();
        Wibble.Name = "Test " + i.ToString();
    
        Context.AddToTests(Wibble);
    
        try
        {
            Context.SaveChanges();
        }
        catch
        {
            Context.ObjectStateManager.GetObjectStateEntry(Wibble).Delete();
        }
    
    }