有什么方法可以告诉 EF 不要担心行数DELETE
or UPDATE
做还是不做?
我试图从数据库中删除一行,但由于该行不存在,EF 抛出异常:DbUpdateConcurrencyException
..说0 行受到影响。这是正确的 -> 没有行被删除。但这完全没问题..因为没有数据。
我真的不想往返数据库来查看该行是否存在..如果存在..然后尝试删除它。
如果我尝试吞下异常try / catch
块,那么当我尝试时,其余要删除的项目不会发送到数据库SaveChanges()
...这很糟糕。
eg.
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试图被删除..因为异常停止了一切:(
有任何想法吗?
UPDATE
如何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
并运行存储过程。
正确的处理方法DbUpdateConcurrencyException
被描述here http://blogs.msdn.com/b/adonet/archive/2011/02/03/using-dbcontext-in-ef-feature-ctp5-part-9-optimistic-concurrency-patterns.aspx=> 在每个异常之后,您应该解决冲突(在您的情况下,这意味着从 DbContext 中删除有问题的实体)并执行SaveChanges
again.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)