10

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

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

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

如果我尝试在一个块中吞下异常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;
    }
}
4

2 回答 2

2

我认为 EF 的行为是正确的——您必须仅对 DB 中存在的对象执行命令。它不适用于以下场景:“我会尝试,我们会看到......”。如果你不能确定对象存在于数据库中并且你不想做往返(我认为这是最好的主意,因为删除分离的对象可能有其他几个陷阱,特别是如果对象参与独立关联)你应该使用DbContext.Database.SqlCommand并运行存储过程。

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

于 2011-02-17T09:28:24.910 回答
-1

实际上,您可以通过设置来忽略这些类型的问题:

db.Configuration.ValidateOnSaveEnabled = false;

dbDbContext 实例在哪里。

显然,当你这样做时,你应该知道你在做什么,但话又说回来,大多数更新不是 EF 的数据库的方法没有任何更改跟踪/验证,只是天真地向数据库发出更新/插入/删除,没有首先检查任何东西,所以你基本上只是告诉 EF 表现得更像那样。

于 2012-08-02T04:53:09.413 回答