當調用SaveChanges
實體框架(CF,C#)/ SaveChangesAsync
,如果發生變化的衝突(例如,值一直上次讀取啄更新),那麼這兩個例外DbUpdateConcurrencyException
OR OptimisticConcurrencyException
我應該抓住?併發異常
它們之間的區別是什麼?
當調用SaveChanges
實體框架(CF,C#)/ SaveChangesAsync
,如果發生變化的衝突(例如,值一直上次讀取啄更新),那麼這兩個例外DbUpdateConcurrencyException
OR OptimisticConcurrencyException
我應該抓住?併發異常
它們之間的區別是什麼?
DbUpdateConcurrencyException
是DbContext
引發的特定異常,所以這是要抓的。這個異常可能是由底層的OptimisticConcurrencyException
引起的,但如果是這樣,則這個異常被封裝爲內部異常。
不是所有的更新異常由併發引起的,所以你也必須抓住DbUpdateException
捕DbUpdateConcurrencyException
後(因爲後者的DbUpdateException
亞型)。請參閱Entity framework 5.0 handle optimistic concurrency exception?。
謝謝您的回答,它似乎是最有可能的情況。我會試着捕捉這兩個例外,看看會發生什麼。感謝您的鏈接了。 – Flair
是的,當然所有異常都不是由於併發而發生的,但是我只關心那些異常(正如我在問題中提到的:如果數據狀態在讀取數據和「SaveChanges」 '電話)。我認爲我的目的'DbUpdateConcurrency'異常應該足夠了,或者?更具體地說,我如何在實體框架中模仿Linq-2-SQL中的ChangeConflictException? – Flair
捕捉'DbUpdateConcurrencyException'是您需要處理與EF中樂觀併發有關的所有內容,如由timestamp/rowversion列或'ConcurrencyMode.Fixed'列(如果您在DbContext API中)配置的。另請參閱http://msdn.microsoft.com/en-us/data/jj592904.aspx。我剛剛提到'DbUpdateException',因爲捕獲順序很重要。 –
您將得到一個OptimisticConcurrencyException
。看看this。
現在來了不同。
根據您得到的答案 - 您是否考慮過,只需一秒鐘,查閱文檔中的例外情況並閱讀這些說明?你基本上要求引用文檔。 – TomTom
當然,我閱讀文檔,但對我來說沒有什麼意義,因爲它們看起來都很相似。 '當樂觀併發異常可能發生時使用它'。因此,我就這個問題給出了一個情況,並在這方面提出了問題! – Flair
我同意Flair關於DbUpdateException,DbUpdateConcurrencyException,OptimisticConcurrencyException的文檔以及爲管理併發異常捕獲什麼不明確 –