【发布时间】:2011-06-28 18:54:47
【问题描述】:
有什么方法可以告诉 EF 不要担心 DELETE 或 UPDATE 做或不做的行数?
我正在尝试从数据库中删除一行,但由于该行不存在,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;
}
}
【问题讨论】:
-
删除功能如何工作?
-
@LukLed - 使用额外代码编辑了 OP。
-
我知道这些删除是更大操作的一部分,不能独立进行?
-
即使它们是独立制作的,也存在同样的问题 -> 尝试删除数据库中不存在的 DETACHED 对象。我不在乎该行是否存在-> 只是尝试删除它。如果它不存在,则没有问题。如果是,则删除。完毕。 /me 打 EF。
-
找到解决方案了吗?在单个 SaveChanges 调用中执行多个操作时,这是一个很大的痛苦。
标签: .net entity-framework entity-framework-ctp5