[英]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.