我認爲也許最初的問題太冗長了太多不必要的細節,所以這是我嘗試簡化。凌駕於LINQ to SQL的實體緩存/變更跟蹤行爲
我在尋找一種方式來執行任何下面的操作。我只需要做一個,而不是全部。如果有人知道其中一個答案,請回復。那麼,是不是可以做到以下任何在LINQ to SQL:通過ExecuteQuery
或ExecuteMethodCall
拉實體出的
DataContext
無需這些實體的跟蹤?調用
ExecuteQuery
或ExecuteMethodCall
並保證我總是收到從數據庫中檢索到的結果的新副本,即使這些實體已經被檢索並且已經在身份緩存中?指示Linq to SQL不要執行任何跟蹤特定實體類型的更改 - 但仍允許更改跟蹤其他類型?
限制:
的
Refresh
方法是不可能的;實體的數量非常大,這將成爲一場表演災難。我不能簡單地設置
ObjectTrackingEnabled
到false
,因爲DataContext
不允許設置回true
查詢執行後,我需要做一些實體進行跟蹤。我也不能扔掉原來
DataContext
並使用一個新的;我需要能夠在交易中做到這一點。
這已經開始成爲一個嚴重的問題,我真的覺得默認的行爲是居心不良。如果我執行即席查詢或存儲過程,我期望我收到的結果是由查詢返回的確切結果。它只有道理;如果我想要舊的,陳舊的實體,爲什麼我會回到數據庫來獲取它們?
目前,我的解決方法是(a)專門爲查詢創建新的DataContext
並覆蓋事務隔離級別,或者(b)使返回類型成爲與實體中的實體相同的「DTO」每種方式但沒有[Table]
屬性,並使用AutoMapper將其映射到原始實體。這兩個看起來像可怕的黑客。
真的很感謝任何人在這個難題中提出的建議。
感謝您的回答。事務真的是一個單一的工作單元,在中間使用一個單獨的'DataContext'會導致DTC升級。從列數據創建新對象是一個很好的觀點,但不幸的是,從數據庫中檢索到的原始實體仍然被緩存 - 這只是對未跟蹤的副本所做的更改,所以它不能解決過時問題數據問題。 – Aaronaught 2010-02-05 21:23:31
是的,我明白你的意思是宣傳DTC的意思;這有點痛苦。你的方法似乎可能是目前唯一可行的路線。 – technophile 2010-02-05 21:33:39