我的項目使用EF(使用自我跟踪模板測試版本4,使用默認模板版本5,所有數據庫優先)針對SQL Server 2012.數據庫表每個都定義了rowversion
( timestamp
)列。
在其中使用EF核心,意味著我的數據庫更新代碼看起來如此:
using (var db = new MyContext())
{
//db.Entry(myInstance).State = EntityState.Modified;
db.SaveChanges();
}
不會觸發任何rowversion
警報。我運行並行客戶端,每個客戶端讀取相同的記錄,對其進行更改,然後將每個客戶端寫入數據庫。接受所有更新,不應用並發。
我是否必須使用存儲過程來獲取更新命令(使用where子句來表明我的rowversion
值)以使EF確認“內置”並發或是否有其他方式(配置,特定方法調用)來生成我的代碼工作?
RowVersion
(或TimeStamp
字段類型)的SQL
是一場的任何其他(除了具有強制性和自我遞增)。有一個特定的數據庫處理它的更新值(即遞增它),但沒有特定的數據庫處理比較它在更新前的值。 EF
允許您為每個字段( edmx
)定義ConcurrencyMode
。如果需要,您可以使用ConcurrencyMode=Fix
(而不是默認的None
)標記所有字段,從而在更新的where子句中包含所有字段(將實體的原始值與記錄在數據庫中的當前值進行比較) 。但是使用該模式為每個實體設置一個字段(即RowVersion
字段)更容易。特別是因為維護它的唯一一方是數據庫。 System.Data.OptimisticConcurrencyException
隔離錯誤。您仍然必須遠離操作對象集的EF
工作流,例如使用myObjectSet.Attach(myEntity)
,它會訪問數據庫以獲取當前數據並將更改合併到其中。由於RowVersion
字段通常未更改,因此更新將使用數據庫中的當前值觸發,並且不會導致並發異常。