DbUpdateConcurrencyException

DbUpdateConcurrencyException

我有什么办法可以告诉EF不用担心DELETEUPDATE做或不做的行数?
我正在尝试从数据库中删除一行,但是由于该行不存在,EF引发了一个异常:DbUpdateConcurrencyException ..说0行受到影响。正确->没有行被删除。但这完全没问题..因为没有数据。
我真的不是想去数据库的往返,以查看该行是否存在..如果是这样..然后尝试将其删除。
如果我尝试在try / catch块中吞下异常,那么当我尝试SaveChanges()时,其余要删除的项目不会发送到db……这很糟糕。
例如。

Delete(new Foo(1));
Delete(new Foo(2));
Delete(new Foo(3));
SaveChanges(); // <-- Throws the exception.

// DB Trace : DELETE FROM Foo WHERE Id = 1;
就是这样..没有任何记录显示试图删除记录2或3的痕迹..因为该异常会停止所有操作:(
有任何想法吗?
更新Delete如何工作?这是代码...(简化和强类型输入)
public void Delete(Foo foo)
{
    if (foo == null)
    {
        throw new ArgumentNullException("foo");
    }

    Foo attachedEntity = Context.Set<Foo>().Local.FirstOrDefault(x => x.Id > 0);

    if (attachedEntity != null)
    {
        // Entity already in object graph - remove entity.
        Context.Set<Foo>().Remove(attachedEntity);
    }
    else
    {
        // Entity not in object graph, attach and set EntityState to Deleted.
        Context.Entry(foo).State = EntityState.Deleted;
    }
}

最佳答案

我认为EF的行为是正确的-简单地,您必须仅对DB中存在的对象执行命令。它不适用于以下情况:“我会尝试的,我们会看到...”。如果不能确定对象是否存在于数据库中,并且不想进行往返(我认为这是最好的主意,因为删除分离的对象可能会有其他一些陷阱,尤其是如果对象参与独立的关联时),则应使用DbContext.Database.SqlCommand并运行存储过程。

here =>描述了处理DbUpdateConcurrencyException的正确方法。在每个异常之后,您应该解决冲突(在您的情况下,这意味着从DbContext中删除有问题的实体),然后再次执行SaveChanges

10-05 23:52