簡體   English   中英

EF樂觀並發異常需要修復

[英]EF optimistic concurrency exceptions need to fix

大家好,我嘗試了一些想法來解決此問題,但都失敗了,所以我為什么要寫這篇文章,以便有人可以在最新的實體框架中為我提供幫助:)

 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();
            }

最后一部分使用此錯誤:

EntityFramework.dll中發生類型為'System.Data.Entity.Infrastructure.DbUpdateConcurrencyException'的異常,但未在用戶代碼中處理

附加信息:存儲更新,插入或刪除語句影響了意外的行數(0)。 自加載實體以來,實體可能已被修改或刪除。 有關了解和處理樂觀並發異常的信息,請參見http://go.microsoft.com/fwlink/?LinkId=472540

乍一看,我相信這段代碼會在第一個using塊中引起您的問題(以及第二個塊中的類似代碼):

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

至此,在代碼中,您已經從EF中檢索了有效記錄,但尚未對其進行任何處理。 現在,您要明確地告訴EF它已被修改,這意味着當您調用SaveChanges()時它將嘗試更新它。 它期望從數據庫中獲得更新的行== 1的計數,但是實際上沒有行被更新,因此它的計數為0,從而導致錯誤。

EF擅長為您跟蹤更改,您幾乎不需要這種狀態管理級別( 有關更多信息,請參見此處 )。 刪除這些代碼塊應該可以解決您的問題。

保羅的分析(零行被更新,原本應該是零行)對我來說似乎是正確的。 通常,導致此錯誤的原因是所謂的TimeStamp字段,用於捕獲並發問題(兩種用戶彼此獨立但同時編輯同一行的情況)。 那么,HB_ImageLibrary表中的任何字段是否標記為“固定”的“時間戳記”?

數據庫和實體之間是什么關系? 首先是模型,首先是Db,然后是代碼?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM