2016-07-24 150 views
1

如何鎖定使用EF Core讀取的行?我發現一個簡單的解決方案,使用TransactionScope's,但他們似乎並沒有工作(類沒有找到)鎖定數據庫行使用實體框架核心讀取

問題是當刪除一個項目,我在一個線程中,並按刪除按鈕兩次,項目是不是第二次,所以我得到一個例外。

我的第一個解決方案是檢查項目是否仍然存在,但作爲方法被稱爲任務,檢查是由兩個任務執行之前,他們之一刪除它。所以我需要鎖定這一行來阻止第二個任務產生錯誤。

一個快速的骯髒的解決方案當然會嘗試空捕獲,但我寧願以一種乾淨的方式處理這個問題。

+0

事務允許執行一個數據庫狀態的多個語句。實體框架支持事務。 –

+1

我認爲更好的辦法是在點擊時禁用「刪除」按鈕。 – Smartkid

+0

@Smartkid謝謝。有沒有想過這樣一個簡單的解決方案 – dnanon

回答

1

另一種選擇是簡單地不使用EF來進行刪除操作。

如果您執行原始SQL DELETE TableName WHERE PrimaryKey = @Key並且記錄已被刪除,那麼您將不會收到錯誤。


小巧玲瓏

using (var sqlConnection = new System.Data.SqlClient.SqlConnection(Connectionstring)) 
    { 
     sqlConnection.Open(); 
     string sqlQuery = "DELETE FROM [dbo].[Customer] WHERE [email protected]"; 
     sqlConnection.Execute(sqlQuery, new {customerId}); 
     sqlConnection.Close(); 

    } 

托爾鏈

dataSource.DeleteByKey ("Customer", CustomerId).Execute(); 

EF

using (var context = new [...]) { 

    context.Database.ExecuteSqlCommand("DELETE FROM [dbo].[Customer] WHERE [email protected]", new SqlParameter("@CustomerId", CustomerId)); 

} 

(是的,使用EF執行非EF查詢是浪費的,但它是一個選項。)

+0

不是很漂亮,但它的工作原理。謝謝 – dnanon

+0

是的。我需要做的就是破解Chain,以便它可以像EF數據上下文中的擴展方法那樣工作。 –

0

在存儲過程中寫入Delete語句(使用將用於delete stmt的where子句的必要參數)並在EF中調用該存儲過程。數據庫將處理併發性。如果您需要知道存儲過程是否刪除任何記錄,它可以返回受影響的行作爲可以在C#中處理的輸出參數。

這是傳統的和恕我直言做到這一點的最佳方式。

0

我覺得你應該永遠保護你的EF查詢中的try/catch只要您是導致INSERT,UPDATE或DELETE,因爲您可以在各種常規條件(如外鍵違規,未找到記錄等)中觸發異常。此類異常應視爲錯誤,但不是致命的,因此應予以處理。那麼你的問題不是由如何避免例外來回答的,而是要確保它不會讓你感到驚訝。

相關問題