EF乐观并发异常需要修复

时间:2015-03-05 18:40:33

标签: c# database entity-framework orm

大家好,所以我已经通过互联网尝试了一些想法来解决这个问题并且所有人都有这样的问题,这就是为什么我写这篇文章所以也许有人可以在实体框架最新版本中帮助我:)

 using (var ctx = new ESContext())
            {
                quote =
                      ctx.HB_Quote.FirstOrDefault(x => x.ID == issuesContract.EvidenceContract.QuoteContract.ServerID) ??
                      new ESModel.HB_Quote()
                      {
                          ID = issuesContract.EvidenceContract.QuoteContract.ServerID ?? 0,
                          QuoteLegend = issuesContract.EvidenceContract.QuoteContract.QuoteLegend,
                          QuoteText = issuesContract.EvidenceContract.QuoteContract.QuoteText
                      };
                if (issuesContract.EvidenceContract.QuoteContract.ServerID == null)
                {
                    ctx.HB_Quote.Add(quote);
                }
                else
                {
                    ctx.Entry(quote).State = EntityState.Modified;
                }
                ctx.SaveChanges();
            }
            using (var ctx = new ESContext())
            {
                imageLibrary =
                       ctx.HB_ImageLibrary.FirstOrDefault(
                           x => x.ID == issuesContract.EvidenceContract.ImageLibaryContract.ServerID) ??
                       new ESModel.HB_ImageLibrary()
                       {
                           ID = issuesContract.EvidenceContract.ImageLibaryContract.ServerID ?? 0,
                           Conclusion = issuesContract.EvidenceContract.ImageLibaryContract.Conclusion,
                           Image = issuesContract.EvidenceContract.ImageLibaryContract.Image,
                           Title = issuesContract.EvidenceContract.ImageLibaryContract.Title
                       };
                if (issuesContract.EvidenceContract.ImageLibaryContract.ServerID == null)
                {
                    ctx.HB_ImageLibrary.Add(imageLibrary);
                }
                else
                {
                    ctx.Entry(imageLibrary).State = EntityState.Modified;
                }
                ctx.SaveChanges();
            }

使用此错误的最后一部分:

  

类型' System.Data.Entity.Infrastructure.DbUpdateConcurrencyException'的例外情况发生在EntityFramework.dll中但未在用户代码中处理

     

其他信息:存储更新,插入或删除语句会影响意外的行数(0)。自实体加载后,实体可能已被修改或删除。有关理解和处理乐观并发异常的信息,请参阅http://go.microsoft.com/fwlink/?LinkId=472540

2 个答案:

答案 0 :(得分:2)

乍一看,我认为此代码导致您在第一个using块中出现问题(以及第二个块中的类似代码):

else
{
    ctx.Entry(quote).State = EntityState.Modified;
}

在您的代码中,您已从EF检索到有效记录,但您尚未对其进行任何操作。现在你明确告诉EF它已被修改,这意味着它会在你调用SaveChanges()时尝试更新它。它期望从更新行== 1的行数据库中获取计数,但实际上没有更新行,因此计数为0,从而导致错误。

EF善于跟踪您的变化,您很少需要此级别的状态管理(See here for a little bit more info)。删除这些代码块应该可以解决您的问题。

答案 1 :(得分:1)

保罗的分析(零行更新,其中一个是预期的)似乎对我来说是正确的。通常导致此错误的原因是所谓的TimeStamp字段,用于捕获并发问题(两个用户彼此独立编辑同一行但同时编辑的情况)。那么,HB_ImageLibrary表中的任何字段都标记为TimeStamp,是固定的吗?

数据库和实体之间有什么关系?模型第一,Db第一,代码第一?