首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EF乐观并发异常需要修复

EF乐观并发异常需要修复
EN

Stack Overflow用户
提问于 2015-03-05 18:40:32
回答 2查看 7.4K关注 0票数 0

大家好,所以我已经在互联网上尝试了一些想法来解决这个问题,而且都失败了,所以我写这篇文章的原因是,也许有人可以在实体框架的最新版本中帮助我:)

代码语言:javascript
复制
 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中,但未在用户代码中处理 附加信息:存储update、insert或delete语句影响到意外的行数(0)。实体可能已被修改或删除,因为实体是加载的。有关理解和处理乐观并发异常的信息,请参见http://go.microsoft.com/fwlink/?LinkId=472540

EN

回答 2

Stack Overflow用户

发布于 2015-03-05 19:18:40

乍一看,我认为这段代码在第一个using块(以及第二个块中的类似代码)中引起了问题:

代码语言:javascript
复制
else
{
    ctx.Entry(quote).State = EntityState.Modified;
}

在您的代码中,您已经从EF中检索到了一个有效的记录,但是您还没有对它做任何事情。现在,您将显式地告诉EF它已被修改,这意味着它将尝试在调用SaveChanges()时更新它。它希望从更新的== 1行的数据库中获得一个计数,但是实际上没有行被更新,所以它得到了0的计数,这导致了您的错误。

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

票数 2
EN

Stack Overflow用户

发布于 2015-03-05 23:11:26

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28885297

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档