使用Entity Framework Core鎖定數據庫行

c# entity-framework-core multithreading

如何用EF Core鎖定讀取行?我使用TransactionScope找到了一個簡單的解決方案,但它們似乎沒有用(找不到類)

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

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

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

一般承認的答案

另一個選擇是不要使用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 CustomerId=@CustomerId";
        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 CustomerId=@CustomerId", new SqlParameter("@CustomerId", CustomerId));

}

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


熱門答案

我覺得你應該總是在導致INSERT,UPDATE或DELETE時在try / catch中屏蔽你的ef查詢,因為你可以在各種常規條件下觸發異常,例如外鍵違規,記錄未找到等等。這樣的異常應該被視為作為一個錯誤,但不是致命的,所以應該處理。然後你的問題不是通過如何避免異常來回答,而是確保它不會讓你感到驚訝。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因