3

我正在開發一個使用實體框架的Web應用程序。我加載對象列表並將其綁定到中繼器以顯示所有項目的摘要。用戶可以點擊中繼器中每個項目的編輯圖標或刪除圖標。實體框架中刪除對象時的併發性

例如:

第1項|編輯|刪除

第2項|編輯|刪除

...

編輯使用rowversion列時併發,因爲記錄被裝入,並ID和rowversion列中的值隱藏表單域堅持正常工作。這些「原始」值隨後可用於稍後進行更新。但是,如果用戶單擊刪除記錄,我從數據庫加載對象,調用DeleteObject(),然後調用SaveChanges()。這個問題是,當我加載記錄時,它得到最新的rowversion值,所以任何併發檢查都變得毫無用處。

如何確保在刪除記錄時進行併發檢查?

+0

我不明白你的問題。爲什麼在刪除記錄時要做任何併發檢查? – ZippyV

+1

例如,假設您正在瀏覽要刪除那些尚未標記爲已付款的記錄。在列出清單後,另一個用戶進入並標記爲已付記錄。根據您看到的信息(現在已陳舊),您決定刪除該記錄。您點擊刪除按鈕,現在已經刪除了付費記錄,因爲它在您的屏幕上顯示爲未付費。在這種情況下,併發檢查可以防止這種情況發生。 – NYSystemsAnalyst

回答

0

在閱讀this question的答案後,我決定採用以下方法。

  1. 使用隱藏的表單字段來存儲ID和rowversion值。
  2. 當用戶單擊刪除按鈕時,從數據庫加載對象。該對象包含的rowversion值可能與存儲在隱藏字段中的值不同。
  3. 將隱藏字段的排列值分配給對象上相應的屬性 。
  4. 爲此對象調用對象狀態管理器的AcceptChanges()方法。這會導致我存儲的rowversion值被接受爲「當前」值。
  5. 刪除對象並調用對象上下文的SaveChanges()。

因此,我試圖刪除記錄時將存儲的原始rowversion值傳遞給SQL,並將其與行中的當前值進行比較。如果它們不匹配,則引發OptimisticConcurrencyException。

5

實際上,如果你想刪除它,你不必從數據庫中加載對象。

取而代之,創建一個ObjectContext,通過Attach(),DeleteObject()和SaveChanges()將ObjectToDelete附加到該上下文。 因此,您將能夠收到關於併發的異常。

0

與Andreas H指定的不同方法是使用存儲過程執行刪除操作。這樣你就可以在存儲過程中執行併發檢查和刪除操作,如果存在違規行爲則會引發異常。