如何使用我的Entity Framework代码忽略DbUpdateConcurrencyException?

时间:2011-02-17 01:15:47

标签: .net entity-framework entity-framework-ctp5

有什么方法可以告诉EF不要担心DELETEUPDATE做或不做的行数?

我正在尝试从数据库中删除一行,但由于该行不存在,EF会抛出异常:DbUpdateConcurrencyException ..说 0行受影响。这是对的 - >没有删除任何行。但那完全没问题......因为没有数据。

我真的不想对数据库进行往返查看该行是否存在..如果是这样..然后尝试删除它。

如果我尝试在try / catch块中吞下异常,那么当我尝试SaveChanges()时,其余要删除的项目不会被发送到数据库...这是坏。

例如

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;
    }
}

2 个答案:

答案 0 :(得分:2)

我认为EF的行为是正确的 - 只需要对DB中存在的对象执行命令。它不适用于:“我会尝试它,我们会看到......”。如果您无法确定DB中是否存在该对象并且您不想进行往返(我认为这是最好的主意,因为删除分离的对象可能有其他几个陷阱,特别是如果对象参与独立关联)您应该使用DbContext.Database.SqlCommand并运行商店程序。

DbUpdateConcurrencyException =&gt;描述了处理SaveChanges的正确方法。在每个例外之后,您应该解决confilicts(在您的情况下,这意味着从DbContext中删除有问题的实体)并再次执行{{1}}。

答案 1 :(得分:-1)

您可以通过设置:

来忽略这些问题

db.Configuration.ValidateOnSaveEnabled = false;

db是DbContext实例。

显然,当你这样做时你应该知道你正在做什么,但是再一次,更新非EF数据库的大多数方法没有任何变更跟踪/验证,只是发布更新/插入/删除数据库天真地没有先检查任何东西,所以你基本上只是告诉EF表现得更像那样。