The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

當使用 DetailsView + LinqDataSource 時發生更新衝突

之前我曾經寫過一篇【解決 LINQ to SQL 資料庫更新衝突的情形】,主要是講解在寫 LINQ to SQL 程式的時候(Code Behind)若發生衝突的解決辦法,但我最近遇到的問題是,當我的頁面用的是 DetailsView + LinqDataSource 且完全是用宣告(Declarative)的方式寫成的,也就是改頁並沒有寫任何程式碼,這時發生了衝突的狀況的錯誤訊息是 Row not found or changed (如下圖示),不過卻完全看不出哪裡錯了,只知道新增資料的時候不會出錯,但每次更新或刪除的時候都會出錯,而從堆疊追蹤(Stack Trace)所顯示的訊息來看,也沒地方讓我修改,遇到這種問題先不要驚慌,因為這應該只能用我文章中說明的第三種方法進行設定了。

Row not found or changed

這問題是這樣發生的,我有個表格其中有三個欄位是透過其他的表格中所寫的觸發程序(TRIGGER)更新的,所以這個表格在新增、編輯、刪除的時候都不會用到,但因為在 LINQ to SQL Designer 中有定義,所以當更新或刪除資料的時候都會去比對資料庫中的值與更新前選取出來的值,就是因為網站已經上線了,所以資料變化的頻率就會變的很高,這才會又發生在開發主機測試沒問題,但部署到上線主機的時候就出問題的情況。

所以如果你在設計 LINQ to SQL 的時候,要切記若資料表中有欄位是計算欄位或欄位的值只會由其他預儲程序更新的話,可以將這些欄位的 UpdateCheck 屬性設定為 Never,就可以避免這些衝突的問題,因為你本來就不會更新這個欄位的值,所以當你設定為 Never 後,這些欄位的資料並不會因為更新動作而被改變。