天天看點

一起談.NET技術,使用LINQ to SQL更新資料庫(中):幾種解決方案方案一:重新指派方案二:禁用對象跟蹤方案三:移除關聯方案四:使用委托方案五:使用UPDATE語句總結

<a href="http://11011.net/software/vspaste"></a>

但我個人認為這是一種避實就虛的方案,沒有使用LINQ to SQL提供的用于更新操作的API,而采取了一種迂回的政策。這其實是一種妥協,難道因為Attach方法“不好用”,我們就不用了嗎?呵呵。

其他的代碼沒有任何變化。

為什麼禁用對象跟蹤之後,就能正常更新了呢?我們還是從源代碼中來尋找答案吧。

在MSDN中我們還得到下面這條有用的資訊:将ObjectTrackingEnable屬性設定為false,可以提高檢索時的性能,因為這樣可以減少要跟蹤的項目。這真是一個很有誘惑的特性。

但禁用對象跟蹤時,要特别注意兩點:(1)必須在執行查詢前禁用。(2)禁用之後不能再調用Attach和SubmitChanges方法。否則都将引發異常。

使用Lambda表達式将GetProduct的邏輯植入UpdateProduct中,并且使用委托将更新邏輯也延緩執行,這樣巧妙地将查找和更新放進了一個DataContext裡,進而繞開了Attach。但是這種方法API有些過于複雜,對用戶端程式設計人員的水準要求過高。而且在Update裡還要執行一遍Get的邏輯,盡管性能上的損失微乎其微,但看上去總多多少少給人一種不夠DRY的感覺。

本文列舉了近幾天我在網際網路上找到的幾種解決方案,它們各有利弊,孰優孰劣,見仁見智。在下篇中,我将對這幾種方法進行性能上的比較,進而找出最優方案。

<a href="http://kb.cnblogs.com/page/55533/">使用LINQ to SQL更新資料庫(上):問題重重</a>

<a href="http://kb.cnblogs.com/page/55535/">使用LINQ to SQL更新資料庫(中):幾種解決方案</a>