1. 程式人生 > >使用Linq 更新資料庫時遇到的一些問題及解決辦法

使用Linq 更新資料庫時遇到的一些問題及解決辦法

前一段時間一直比較忙,沒時間將自己在工作中總結的一些經驗拿出來和大家分享。幸好今天有點時間,就寫寫吧。

在學習LINQ 時,我幾乎被一個困難所擊倒,這就是更新資料庫的操作。

剛開始使用Linq,對linq 的更新策略還不是很瞭解,所以在設計資料庫的時候根本就沒有考慮到更新檢查策略。在插入的時候沒有任何問題,更新資料的時候,問題就來了,報錯:“System.Data.Linq.ChangeConflictException: Row not found or changed”(找不到行或行已更改)。

在網上查了下,這個問題有兩種解決辦法:

方法一:增加 timestamp(時間戳)列;

方法二:設定主鍵 IsVersion="true"。

最開始,我選用了方法二,OK,更新資料庫沒有問題了。但是,插入的時候報錯:“主鍵不能插入NULL值”,設定斷點,單步跟蹤,直到 SubmitChanges()之前,都是有值的,執行SubmitChanges()方法,就報上面的錯誤。無奈,我決定使用方法一:設定timestamp列,OK,插入和更新都不報錯了。

下面我來簡單說一下Linq的更新檢查策略。

在正常執行狀態下,Linq在執行時,會把資料庫的資料快取到實體物件中,所以我們更新資料的時候,並不是直接更新資料庫,而是更新快取中的資料,然後將更改提交到資料庫。

Linq採用了一種叫做“樂觀式併發”的策略。樂觀式併發允許任意多的使用者隨時修改他們自己的一份資料的拷貝。在提交修改時,程式將檢查以前的資料是否有所改變。若沒有變化,則程式只需儲存修改即可。若發生了變化並存在衝突,那麼程式將根據實際情況決定是將前一修改覆蓋掉,還是把這一次新的修改丟棄,或是嘗試合併兩次修改。樂觀式併發的前一半操作相對來說比較簡單。在不需要併發檢查的情況下,資料庫中使用的SQL語句將類似於如下語法:UPDATE TABLE SET [field = value] WHERE [Id = value]

。不過在樂觀式併發中,Where子句將不只包含ID列,同時還要比較表中其他各列是否與原有值相同,Linq會預設把除更新欄位外的所有欄位,作為Update語句中的Where條件。 在呼叫DataContext的SubmitChanges方法時,LINQ將生成上述Update語句併發送給資料庫處理。若這條語句並沒有更新資料庫中的任意一行,那麼DataContext就得知更新過程中產生了衝突,於是丟擲“找不到行或行已更改”異常。

實際使用中,若用來實現樂觀式併發的引數數量過多,可能會導致一些效能上的問題。在這種情況下,我們可以藉助UpdateCheck來修改對映規則,只讓物件中的一部分屬性參與到樂觀式併發檢查中。在預設情況下,屬性的UpdateCheck將設定為Always,即表示LINQ to SQL將用該屬性檢查樂觀式併發。我們可以根據需要將其調整為只在該屬性值發生改變時才檢查(WhenChanged),或是從不使用該屬性進行檢查(Never)。

若在資料表中有timestamp 列,其它列(主鍵除外)的UpdateCheck屬性會預設設定為Never,若使用IsVersion作為更新檢查依據,則必須在欄位上手動設定UpdateCheck.Never屬性來避免更新檢查,但是如果資料表更新或者新增儲存過程,需要重新生成dbml的話,你在欄位上設定的IsVersion和UpdateCheck.Never都將消失不見,你需要手動重新設定一遍,真是煩不勝煩,所以我推薦使用timestamp作為更新檢查依據。

相關推薦

使用Linq 更新資料庫遇到的一些問題解決辦法

前一段時間一直比較忙,沒時間將自己在工作中總結的一些經驗拿出來和大家分享。幸好今天有點時間,就寫寫吧。 在學習LINQ 時,我幾乎被一個困難所擊倒,這就是更新資料庫的操作。 剛開始使用Linq,對linq 的更新策略還不是很瞭解,所以在設計資料庫的時候根本就沒有考慮到

Activiti+oracle 啟動專案不能自動建表或更新表的問題分析解決辦法

現象描述:按照正常配置,第一次啟動時不能自動建表 關鍵配置片段如下: <bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguratio

mysql-所問題解決辦法

1.1366錯誤 導致1366錯誤的原因是:資料庫此欄位的字符集與整理字符集不同。 只需要將資料庫的字符集、表的字符集、各欄位的字符集調整設為相同即可。 通過 show full columns from 表名 可以檢視各欄位的字元 通過 show full columns from

Spring Boot JPA MySQL 入庫MySQL資料庫中文亂碼的解決辦法

問題表述:        上篇部落格中抒寫了Spring Data Jpa實體類自動建立資料庫表失敗解決即原因(踩過的坑),接著在操作JPA插入資料進資料庫時,發現數據庫的值為中文亂碼(??),需要注意一下的配置點,所以記錄一下,希望能幫到大家(#^.^#

CentOS7安裝docker-ce-17.03.2的問題解決辦法

Available: docker-ce-selinux-17.03.0.ce-1.el7.centos.noarch (docker-ce-stable) docker-ce-selinux = 17.03.0.ce-1.el7.centos

WKWebView載入Http頁面更新後不重新整理問題解決辦法

WKWebView在載入HTTP的H5頁面,由於沒有HTTPS的加密傳輸,所以會在本地快取CSS樣式、Html網頁(類似電腦上下載到本地的網頁)等內容,所以在後臺更改H5頁面之後,APP由於快取的問題不能展示更改後的頁面 iOS7的系統繼續使用UIWebView載入不會出現

jquery序列化serialize()方法中文亂碼解決辦法

全臺: var params=encodeURI(encodeURI(decodeURIComponent($("#xyyycxbForm").serialize(),true))); loadJqueryHtml($(".xkTwoPublic-container").a

Win10 系統安裝Sql Server2008 R2 資料庫遇到的問題解決辦法總結!

1.開始安裝時,提示要先安裝 “.NET Framework 3.5(包括.NET 2.0和3.0)”,之前已經下載好.NET Framework 3.5 sp1,安裝時還是提示要先安裝 “.NET Framework 3.5(包括.NET 2.0和3.0)”,結果還是要去

資料庫死鎖原因解決辦法

死鎖(Deadlock) 所謂死鎖:是指兩個或兩個以上的程序在執行過程中,因爭奪資源而造成的一種互相等待的現象,若無外力作用,它們都將無法推進下去。此時稱系統處於死鎖狀態或系統產生了死鎖,這些永遠在互相等待的程序稱為死鎖程序。由於資源佔用是互斥的,當某個程序提出申請

jupyter 安裝更換主題各類問題解決辦法

寫在前面 jupyter的優點和特點此處就不談了,目前感覺到的一個比較明顯的缺點就是 太亮了,工欲善其事必先利其器,為了更好的編(zhuang)碼(B),所以想看看能不能修改一下樣式,安裝一個外掛什麼的,改變一下背景顏色和字型。 具體效果見github

QT、VS常見bug解決辦法(十一)—— fatal error LNK1201:寫入程式資料庫“***.pdb”出錯;請檢查是否是磁碟空間不足、路徑無效或許可權不夠

 問題:         fatal error LNK1201:寫入程式資料庫“***.pdb”時出錯;請檢查是否是磁碟空間不足、路徑無效或許可權不夠  最近用opencv2.4.10、vs2010做開發經常遇到這個問題,經百度發現大部分是vs自己的問題 解決辦法1:

db2 v9.5遷移至v10.5,重名節點資料庫無法建立db的解決辦法

同系統同版本可以使用備份恢復,本文前提是不同系統不同版本,使用db2move命令。 1、db2move db db_name export 此處注意,先建個目錄放檔案,因為檔案比較多,如果上來直接export就會在當前目錄下生成了。mkdir /home/backup/m

在IDEA中使用JDBC獲取資料庫連線的報錯解決辦法

在IDEA中使用JDBC獲取資料庫連線時,有時會報錯Sat Dec 19 19:32:18 CST 2020 WARN: Establishing SSL connection without server's identity verification is not recommended. Accordi

<canvas合成海報>所問題解決方案總結

設置 iphone 出現問題 保存 白屏 全屏 分享 ase .get 最近做了一個用canvas合成海報圖片的移動端項目,由於一點canvas基礎都沒有,所以去網上搜了一位前輩的demo,但是開發過程中遇到了很多問題,現將所遇問題及解決方法總結如下: 1、移動端c

Jmeter3.1、Ant、Jenkins接口自動化平臺搭建步驟;所問題解決方案

oracle 不兼容 網頁 href variable lan sign 停止 進行 Win下Jenkins+Jmeter+Ant自動化集成環境搭建 環境:win10 涉及:Jdk1.7.0_80、Jenkins2.60.3、Jmeter3.1、Ant1.9.9 步驟: 1

手機端頁面在項目中遇到的一些問題解決辦法

文本 phone 發生 box art 單選框 打電話 但是 href 前言:前段時間遇到點移動端的問題,網上查找點資料,看到一個挺不錯帖子,所以轉載分享給大家。 1.解決頁面使用 overflow: scroll 在 iOS 上滑動卡頓的問題? 首先你可能會給頁面的 ht

PPTP連線常見撥號錯誤提示原因解決辦法

相信大家在連線PPTP的時候,總會出現這樣那樣的錯誤程式碼,很令人頭疼,下面我為大家整理了一些常見的錯誤程式碼供參考:×××錯誤619解決辦法 詳解:私設IP或路由器不支援ppTp pass through,或是此IP地址是私設IP。這種情況大數多原因為客戶機連線Internet的閘道器(如家庭寬

使用jdbc連線資料庫一些錯誤

如果使用了mysql8.0以上的版本 異常資訊: 你如果用的包是以前的包的話,會提示使用caching_sha2_password 或者是 Loading class `com.mysql.jdbc.Driver'. This is deprecated. The new driver class i

轉載:oracle執行update語句卡住問題分析解決辦法

oracle執行update語句時卡住問題分析及解決辦法  這篇文章主要介紹了oracle執行update語句時卡住問題分析及解決辦法,涉及記錄鎖等相關知識,具有一定參考價值,需要的朋友可以瞭解。 問題 開發的時候debug到一條update的sql語句時程式就不動了,然後我就

chrome安裝或更新失敗可能原因解決辦法

Chrome在安裝或更新時,可能會出現0x80070057、0x80040154、0x80004002、0x8004070c、0x80080005、0x80072EFD、0x80072EE2等錯誤,本文說明如何解決這些問題。 解決Chrome安裝或更新中出現的0x80070057等錯誤