Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何使用实体框架代码忽略DbUpdateConcurrencyException?_.net_Entity Framework_Entity Framework Ctp5 - Fatal编程技术网

.net 如何使用实体框架代码忽略DbUpdateConcurrencyException?

.net 如何使用实体框架代码忽略DbUpdateConcurrencyException?,.net,entity-framework,entity-framework-ctp5,.net,Entity Framework,Entity Framework Ctp5,我有没有办法告诉EF不要担心删除或更新的行数 我试图从数据库中删除一行,但由于该行不存在,EF引发异常:DbUpdateConcurrencyException。。表示0行受影响。这是正确的->未删除任何行。但那完全没关系。。因为没有数据 我真的不想往返DB以查看该行是否存在。。如果是的话。。然后尝试删除它 如果我尝试在try/catch块中吞下异常,那么当我尝试SaveChanges()时,要删除的其余项目不会被发送到数据库。。。这很糟糕 例如 我认为EF的行为是正确的——只需对DB中存在的对

我有没有办法告诉EF不要担心删除或更新的行数

我试图从数据库中删除一行,但由于该行不存在,EF引发异常:
DbUpdateConcurrencyException
。。表示0行受影响。这是正确的->未删除任何行。但那完全没关系。。因为没有数据

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

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

例如


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


处理
DbUpdateConcurrencyException
的正确方法如下所述=>在每次异常后,您应该解决Conflicts(在您的情况下,它意味着从DbContext中删除有问题的实体)并再次执行
SaveChanges

您实际上可以通过设置忽略这些问题:

db.Configuration.ValidateOnSaveEnabled=false

其中
db
是DbContext实例


显然,在执行此操作时,您应该知道自己在做什么,但是,大多数更新非EF数据库的方法都没有任何更改跟踪/验证,只是简单地向数据库发出更新/插入/删除命令,而不先检查任何内容,因此,你基本上只是告诉EF要表现得更像这样。

删除功能是如何工作的?@LukLed-编辑了带有额外代码的OP。我知道这些删除是更大操作的一部分,不能独立进行?即使它们是独立进行的,同样的问题也存在->试图删除数据库中不存在的分离对象。我不管行是否存在->只要尝试删除它。如果它不在那里,没有问题。如果是,则删除。完成了/我打了EF。有没有找到解决办法?在单个SaveChanges调用中执行多个操作时,这是一个很大的难题。啊:)今天早些时候,我正在练习使用try/catch来处理
Context.SaveChanges()
异常。。但我所做的只是刷新一下。。然后再次保存更改()。。这当然不起作用(抛出了相同的错误)。你能更新你的答案,包括你如何从上下文中删除有问题的实体吗?@Pure.Krome:我会尝试使用ChangeTracker并将实体状态设置为Detached。你能详细说明你之前的评论吗?@Pure.Krome:尝试使用
exception.GetEntry(dbContext)。state=EntityState.Detached捕获异常的位置
DbUpdateConcurrencyException
。如果这不起作用,你只需检查实体是否存在,然后再将其标记为已删除。我不同意这个答案,EF的行为是不正确的。这样想吧——用户A确实选择了,存在着。用户B确实存在,存在。用户A删除,成功。用户B删除,异常失败。在这两种情况下,结果应该是相同的-我们正在删除记录。当然,存在冲突,但结果是一样的——删除了一行。没有什么要解决的。“先检查它是否存在”不起作用——这是一种竞赛条件。不能在所有情况下都锁定读取,在我们的例子中,我们使用的是MySQL集群-没有读取锁定。你确定吗?ValidateOnSaveEnabled控制数据批注验证,而不是并发性。我的理解是(从EF4.3开始)没有办法抑制删除的DbUpdateConcurrencyValidation;我创建了2个DBContext,一个用于获取对象,另一个用于获取、更改和保存对象,最后尝试更改和保存第一个对象。我有一个例外;将上述设置更改为false,再次运行,无异常。另外,你检查过文件了吗?它指的是验证实体,而不是模式:如果不起作用,仍然会抛出
DbUpdateConcurrencyException
。我用2个DBContext实例进行了测试。在第一个上下文中编辑一个实体,并将
ValidateOnSaveEnabled
设置为
false
,然后在第二个上下文中删除该实体并保存,然后在第一个上下文中保存,但会出现异常。
Delete(new Foo(1));
Delete(new Foo(2));
Delete(new Foo(3));
SaveChanges(); // <-- Throws the exception.

// DB Trace : DELETE FROM Foo WHERE Id = 1;
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;
    }
}