2016-06-28 75 views
0

我有做2 AJAX調用一個Web Api方法,做以下邏輯頁:網頁API併發問題察看項目存在

  1. 檢查該項目是否存在。如果是這樣,檢索項目。
  2. 如果項目不存在,請創建它。

代碼:

if (!_db.Items.Any(x => x.EntityId == requestItem.EntityId &&        
          x.UserId == request.UserId)) 
{ 
    // item does not exist, so create it. 
    var item = new Item(); 
    // set some properties here... 

    _db.Items.Add(item); 
} 

我遇到的問題是,項目正在創造非常快,因爲Ajax調用同時運行,我結束了兩個項目。但我只想讓1被創建。我不想向用戶拋出錯誤。我想只能創建一個項目,如果一個真的不存在。我怎樣才能做到這一點?

我看到這個post設置與實體框架的併發檢查,但我不想向用戶拋出一個錯誤,所以我不知道設置EF併發是我需要做的。值不會相互覆蓋。兩個電話正在(接近)同一時間發生,所以都看到表中有0個項目。

+0

如果你不想錯誤回到用戶,只需用try-catch包裝進程即可。 – Tommy

+0

我沒有遇到覆蓋以前值的數據。因此,檢查RowVersion屬性將不起作用,因爲該項目尚不存在。我無法限制1個項目的創建。 – duyn9uyen

+0

是否可以接受複合唯一密鑰? – Tommy

回答

0

您必須在您的請求中設置一個唯一標識符,以便能夠確定服務器上的雙重發布。

我建議在頁面加載時生成一個UID。 當用戶點擊發送請求到web api的按鈕時,傳遞生成的UID。

現在,如果用戶多次單擊該按鈕,它仍然會傳遞相同的UID值,因爲它是在頁面加載時生成的,而不是用戶單擊的。

在服務器上,執行相同的檢查。

if (!_db.Items.Any(x => x.EntityId == requestItem.EntityId &&        
          x.UserId == request.UserId)) 
{ 
    // item does not exist, so create it. 
    var item = new Item(); 
    // set some properties here... 

    _db.Items.Add(item); 
} 

我建議使用的UID從請求爲requestItem.EntityId

沒有必要,因爲你使用的是簡單的if語句,這足以將一個try-catch塊。你最好找到一個JavaScript UUID生成代碼或庫:)

+0

謝謝,但我不需要防止雙重職位。我希望能夠處理它,如果客戶正在做並行的Ajax承諾。 – duyn9uyen