0
我目前正在使用Code first Entity框架(5.0)製作ASP.NET MVC4應用程序。這是我第一個使用ASP.NET MVC和Entity框架的項目,所以我對一些細節感到不知所措。該應用程序處理出納員在超市的交易。實體框架約束保持併發調用的值爲正
爲了在超市進行銷售,我有一個可用產品清單和每個可用的金額。正如邏輯所指出的那樣,任何時候都不應該有一個給定產品的負數 - 所以我的問題是,我怎樣才能以最好的方式解決併發問題?當發生這種情況可能出現
問題:
我們有4個香蕉可用。 收銀員A試圖出售2香蕉。 收銀員B試圖同時銷售3個香蕉。 如果兩個事務都通過,數據庫將保留-1香蕉並處於無效狀態。
那麼防止這種情況的最好方法是什麼?我試圖找到幾個選項,但我不知道選擇哪一個或者它們是否合適:
- 添加一個Rowversion列,以便每個事務只在沒有更改時才進行數據庫。我在這裏看到的問題是,在同一時刻可能會有很多交易,我不知道是否這樣嚴格的支票(每當另一個收銀員進行交易時都會返回一個錯誤)是值得的,因爲我們只需要保留金額正面。即每天可能只有1-2筆交易導致問題,收銀員將不得不重新檢查其銷售額。
- 在事務中的每個SaveChanges之後執行檢查,如果項目數量無效,則回滾。
任何幫助將不勝感激!
第二種選擇看起來不錯,但我找不到辦法做到這一點。如果savechanges()在值<0時拋出一個異常,那就完美了。 但是我怎樣才能使用代碼優先添加列約束?範圍似乎沒有在數據庫級別做任何事情作爲約束。我必須手動添加它,以及如何? 感謝您的幫助! – LTsonov 2013-02-24 09:58:37
您可能會在Customizing Migrations下找到您需要的地址http://msdn.microsoft.com/en-US/data/jj591621。另一種選擇是運行一些自定義DDL來生成約束。 – qujck 2013-02-24 10:30:00
顯然,Code-first目前不支持通過Annotations檢查約束。 到目前爲止,我想出唯一的辦法就是你提出的一個:寫DDL自己在基於代碼的遷移,因爲這: SQL(「ALTER TABLE CashDesk添加約束CK_Positive_Money_Amount CHECK(AvailableAmount> = 0) 「); 感謝您的協助! – LTsonov 2013-02-24 11:05:16