19

當調用SaveChanges實體框架(CF,C#)/ SaveChangesAsync,如果發生變化的衝突(例如,值一直上次讀取啄更新),那麼這兩個例外DbUpdateConcurrencyException OR OptimisticConcurrencyException我應該抓住?併發異常

它們之間的區別是什麼?

+0

根據您得到的答案 - 您是否考慮過,只需一秒鐘,查閱文檔中的例外情況並閱讀這些說明?你基本上要求引用文檔。 – TomTom

+7

當然,我閱讀文檔,但對我來說沒有什麼意義,因爲它們看起來都很相似。 '當樂觀併發異常可能發生時使用它'。因此,我就這個問題給出了一個情況,並在這方面提出了問題! – Flair

+0

我同意Flair關於DbUpdateException,DbUpdateConcurrencyException,OptimisticConcurrencyException的文檔以及爲管理併發異常捕獲什麼不明確 –

回答

12

DbUpdateConcurrencyExceptionDbContext引發的特定異常,所以這是要抓的。這個異常可能是由底層的OptimisticConcurrencyException引起的,但如果是這樣,則這個異常被封裝爲內部異常。

不是所有的更新異常由併發引起的,所以你也必須抓住DbUpdateExceptionDbUpdateConcurrencyException後(因爲後者的DbUpdateException亞型)。請參閱Entity framework 5.0 handle optimistic concurrency exception?

+0

謝謝您的回答,它似乎是最有可能的情況。我會試着捕捉這兩個例外,看看會發生什麼。感謝您的鏈接了。 – Flair

+1

是的,當然所有異常都不是由於併發而發生的,但是我只關心那些異常(正如我在問題中提到的:如果數據狀態在讀取數據和「SaveChanges」 '電話)。我認爲我的目的'DbUpdateConcurrency'異常應該足夠了,或者?更具體地說,我如何在實體框架中模仿Linq-2-SQL中的ChangeConflictException? – Flair

+1

捕捉'DbUpdateConcurrencyException'是您需要處理與EF中樂觀併發有關的所有內容,如由timestamp/rowversion列或'ConcurrencyMode.Fixed'列(如果您在DbContext API中)配置的。另請參閱http://msdn.microsoft.com/en-us/data/jj592904.aspx。我剛剛提到'DbUpdateException',因爲捕獲順序很重要。 –

2

您將得到一個OptimisticConcurrencyException。看看this

現在來了不同。

  • OptimisticConcurrencyException:拋出時樂觀併發衝突發生(假設多於一個perople正在改變到相同的結果,並且這將導致不被sychronized的問題)
  • DbUpdateConcurrencyException:拋出異常通過DbContext預期的行爲是實體的SaveChanges會導致數據庫更新,但實際上數據庫中沒有行受到影響。這表明數據庫已經同時更新,並且預期匹配的併發令牌實際上沒有匹配。此異常引用的狀態條目由於安全性以及序列化返回null後對狀態條目的訪問而未被序列化。