程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> VS2008的Linq更新數據就那麼費勁?(2)

VS2008的Linq更新數據就那麼費勁?(2)

編輯:關於C語言

Linq會怎麼做呢?和上面一樣!取出所有字段,把View加一,用所有字段做為條件(包括VIEws),更新回去。

設想一下,這樣一個被頻繁使用的計數器,兩次操作出現SELECT與UPDATE交叉情況的可能性很大,那麼後者還能更新成功麼?

微軟就是這樣解釋的,如果在你更新過程中,有其他人更新了這一行,那麼這一行也就不是你所需要的那一行了,為了防止這樣的沖突,所以把所有字段都放在WHERE語句中,這是by design的。

你可以通過其他方法進行更新數據,然而在目前版本,這個方法也表現的不怎麼樣。

System.Data.Linq.Table<T>有一個Attach方法,帶有三個重載,用來直接更新數據的,我們來一個一個的來看看。

Attach(T entity)
1var ctx = new MyDataContext();
2var newUser = new User();
3newUser.UserId = new Guid("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx");//假設作為參數傳進來的
4newUser.UserName = "New User Name";
5ctx.Users.Attach(newUser);
6ctx.SubmitChanges();

運行完全沒有任何效果,SQL Profiler無任何記錄。

Attach(T entity, T original)
1var ctx = new MyDataContext();
2var newUser = new User();
3newUser.UserId = new Guid("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx");//假設作為參數傳進來的
4newUser.UserName = "New User Name";
5var user = ctx.User.Where(u => u.UserId = newUser.UserId).Single();
6ctx.Users.Attach(newUser, user);
7ctx.SubmitChanges();

運行時提示: Cannot add an entity with a key that is already in use.

Attch(T entity, bool asmodifIEd)
1var ctx = new MyDataContext();
2var newUser = new User();
3newUser.UserId = new Guid("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx");//假設作為參數傳進來的
4newUser.UserName = "New User Name";
5ctx.Users.Attach(newUser, true);
6ctx.SubmitChanges();

運行時提示:An entity can only be attached as modifIEd without original state if it declares a version member or does not have an update check policy.

怎麼辦?提示中說"declares a version member ",通常來說是指SQL Server中TimeStamp類型的字段,在你所需要更新的表中加上一個字段,並標記為TimeStamp就可以了。但是這樣做,對於我們來說仍然是個浪費,並且WHERE語句中仍然會出現TimeStamp的限制。

你還可以通過在字段上設置UpdateCheck.Never屬性來避免更新檢查,但是如果數據表更新、新增存儲過程,需要重新生成dbml的話,你需要手動重新設置一遍。

Linq甚至沒有一個類似Web引用中Update Web Reference的操作來讓你方便的在數據表更新後更新dbml,並且在這個版本都不會提供,你所能做的只有刪除原來的表,刷新Server Exploer,重新拖拽到dbml的設計視圖中,或者,寫個腳本,讓SQLMETAL來幫你完成這些。

結論:

Linq雖然做為一個查詢語言出現,但是在數據更新方面也是做了不少工作的,尤其是一些CHECK的工作,但對於寫慣SQL的我們來說,還是很不習慣,甚至覺得,這些工作你不替我做才好呢。

在沒有更好解決辦法的前提下,在更新操作上,老老實實的寫SQL語句或者存儲過程應該是個不壞的選擇。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved