2009-11-06 130 views
2

當使用Linq2sql時,一切都自動運行。我的經驗是,隨着流程的發展並不總是最好的解決方案,並理解內部工作是如何更好,所以你最佳地使用技術。linq2sql如何跟蹤數據庫對象?

所以,我的問題是關於linq2sql。

如果我做了一個查詢並獲得一些數據庫對象,或者我創建了一個新對象,linqcontext對象不知何故地保持對這些對象的引用。如果其中一個對象發生了某些變化,則上下文對象'知道'發生了什麼變化並需要更新。

如果我對該對象的引用設置爲null,這是否意味着該上下文對象還會刪除它與該對象的鏈接?或者是上下文對象慢慢充滿大量的引用,並保持我的數據庫對象垃圾收集?

如果不是,這是如何工作的?

此外,數據庫對象總是遍歷整個列表以查看更改和更新它是否不是很慢?

任何有關如何運作的見解將是非常好的!

謝謝

+0

你應該添加「linq-to-sql」標籤到你的問題,因爲它是特定於linq – 2009-11-06 19:34:08

+0

的味道marcel:好主意 – Toad 2009-11-06 19:34:41

+0

你誤解了我,已經有一個標籤「linq-to-sql」,你剛剛創建了一個新的標籤;-) – 2009-11-06 20:05:12

回答

2

是的,上下文保持加載對象的引用。這就是爲什麼它不能用於與不同請求共享的單個實例的原因之一。

它保留插入/刪除列表。我不確定它是否捕獲將這些更新添加到列表中的更新,或者它最終會循環。但是,你不應該一次加載大量的數據,因爲單獨的數據對性能的影響可能比它在列表中可能做的最後一次檢查更大。

+0

你對不同請求的分享意味着什麼? Shoudl爲每個查詢創建一個新的上下文? – Toad 2009-11-06 19:30:18

+0

@reinier在asp.net上(這可能不是你的情況),如果你爲不同的請求保留相同的上下文實例,你將保留所有的跟蹤對象。除了性能,考慮如果某些進程正在對某些db對象進行一些更改,並且由於某些驗證您沒有提交這些更改......那麼在另一個進程中,您會執行一些無關的更改並在上下文中調用提交更改 - - 你會承諾你沒有打算的其他改變。 – eglasius 2009-11-06 19:33:26

+0

是的,最好儘可能縮短您的數據上下文生命週期。 – 2009-11-06 19:34:51

2

DataContext註冊到您的對象PropertyChanged事件以瞭解它何時被修改。此時,它會克隆原始對象,並在您執行SubmitChanges()時保留它以將兩個對象進行比較。

如果我對該對象的引用設置爲null,這是否意味着上下文對象也將其刪除到該對象的鏈接?

編輯編號對不起,我的原始答案我誤解了你寫的東西。在這種情況下,數據上下文仍然有對這兩個對象的引用,但會刪除與下一個SubmitChanges()上的這兩個對象的關係。

但要小心。如果您創建了自己的對象而不是使用從.dbml生成的對象,那麼datacontext執行的「魔術」可能無法正常工作。

+0

創建對象我的意思是從我的表格創建的dbml – Toad 2009-11-06 19:36:45

+0

@Marcel afaik當您將您自己的對象引用設置爲null時,它不會刪除未引用的對象。 – eglasius 2009-11-06 19:38:29

+0

感謝Freddy,我編輯了我的答案 – 2009-11-06 20:09:19