.net 4.0 在这个实体框架代码中,我应该如何处理这个乐观并发错误?

.net 4.0 在这个实体框架代码中,我应该如何处理这个乐观并发错误?,.net-4.0,repository-pattern,entity-framework-4,race-condition,optimistic-concurrency,.net 4.0,Repository Pattern,Entity Framework 4,Race Condition,Optimistic Concurrency,在使用EF4的某个存储库模式项目中,我有以下PSEDOO代码 非常简单,但我得到一个运行时错误:- 并发异常:存储、更新、, 插入或删除受影响的语句 意外的行数为0 现在,这就是正在发生的事情:- 两个EF4实例同时在应用程序中运行。 实例A调用delete。 实例B在一纳秒后调用delete。 实例A加载实体。 实例B也加载实体。 实例A现在删除该实体-酷香蕉。 实例B试图删除该实体,但该实体已不存在。因此,当预期为1时,no count或what not为0。。或者类似的。基本上,它发现它应

在使用EF4的某个存储库模式项目中,我有以下PSEDOO代码

非常简单,但我得到一个运行时错误:-

并发异常:存储、更新、, 插入或删除受影响的语句 意外的行数为0

现在,这就是正在发生的事情:-

两个EF4实例同时在应用程序中运行。 实例A调用delete。 实例B在一纳秒后调用delete。 实例A加载实体。 实例B也加载实体。 实例A现在删除该实体-酷香蕉。 实例B试图删除该实体,但该实体已不存在。因此,当预期为1时,no count或what not为0。。或者类似的。基本上,它发现它应该删除的项目没有删除,因为它发生在一秒钟前。 我不确定这是否是一个比赛条件或什么

不管怎样,我能在这里做些什么,这样第二个电话就不会崩溃了吗?我可以把它变成一个存储过程。。但我现在希望避免这种情况


有什么想法吗?我想知道是否可以锁定该行,并且只有在调用select时才能锁定该行。。。强制实例B等待行锁被释放。此时,行被删除,因此当实例B执行其选择时,数据不在那里。。因此它永远不会删除。

通常,您会捕获OptimisticConcurrencyException,然后以对您的业务模式有意义的方式处理问题,然后再次调用SaveChanges

try
{
    myContext.SaveChanges();
}
catch (OptimisticConcurrencyException e)
{
    if (e.StateEntries.FirstOrDefault() is DeletingObject)
        myContext.Detach(e.StateEntries.First();
    myContext.SaveChanges();
}

试一试,看看你的进展如何——没有经过测试/编译或其他什么——我已经使用DeletingObject作为你试图删除的实体的类型。替换实体类型。

通常,您会捕获OptimisticConcurrencyException,然后以对您的业务模型有意义的方式处理问题,然后再次调用SaveChanges

try
{
    myContext.SaveChanges();
}
catch (OptimisticConcurrencyException e)
{
    if (e.StateEntries.FirstOrDefault() is DeletingObject)
        myContext.Detach(e.StateEntries.First();
    myContext.SaveChanges();
}

试一试,看看你的进展如何——没有经过测试/编译或其他什么——我已经使用DeletingObject作为你试图删除的实体的类型。替换实体类型。

为什么不直接处理并发异常?如果该对象已从另一个线程(也称为EF实例)中删除,则该线程将不剩下任何工作,因为记录已被删除。这就是问题所在->两个实例都认为它们有一个要删除的对象,因为它们都同时从DB中读取。只是实例A实际上完成了DeleteObject。。方法在第二次调用之前的纳秒。。对于同一个对象。现在我可以处理这个异常了。。但我觉得这是在回避真正的问题。。我想知道是否可以通过一些锁定或其他方法来处理它?为什么不直接处理并发异常呢?如果该对象已从另一个线程(也称为EF实例)中删除,则该线程将不剩下任何工作,因为记录已被删除。这就是问题所在->两个实例都认为它们有一个要删除的对象,因为它们都同时从DB中读取。只是实例A实际上完成了DeleteObject。。方法在第二次调用之前的纳秒。。对于同一个对象。现在我可以处理这个异常了。。但我觉得这是在回避真正的问题。。我想知道它是否可以通过一些锁定或其他方式来处理?嗯,很有趣。你能解释一下你在抓鱼时想做什么吗?在我的初始示例中,如果Instance_B执行delete。。它抛出了一个异常。。然后你试着去看。。删除对象,因为它不应该在那里?通过分离已删除的对象,我试图阻止状态管理器将删除操作推送到数据库。应删除的对象仍处于附加状态,其实体状态为“已删除”。我刚刚运行了一个快速测试,并调用.DeleteObjectmyObject后跟.DetachmyObject后跟.SaveChanges不会推动删除。试试看是否有用。嗯,很有趣。你能解释一下你在抓鱼时想做什么吗?在我的初始示例中,如果Instance_B执行delete。。它抛出了一个异常。。然后你试着去看。。删除对象,因为它不应该在那里?通过分离已删除的对象,我试图阻止状态管理器将删除操作推送到数据库。应删除的对象仍处于附加状态,其实体状态为“已删除”。我刚刚运行了一个快速测试,并调用.DeleteObjectmyObject后跟.DetachmyObject后跟.SaveChanges不会推动删除。给它一个开始,看看它是否有帮助。