2011-01-14 238 views
0

我有一個web應用程序。它在小型桌面上執行TON數據讀取和一些寫操作。我想將整個數據表拖入緩存中,並查詢緩存的數據。我重寫上下文的表<T>()方法,以便我們可以緩存而不是實時數據。非常適合插入並支持單元測試數據訪問。真棒。緩存Linq2Sql數據

所以我們開始使用緩存數據,發現更新和刪除不起作用。

我們拉的對象從數據庫,把它變成一個列表<T>,把該列表中httpCache,然後刪除數據上下文。

兩個請求後,我們所說的重寫表<T>,它得到的名單,和拉動對象了。我們改變它,然後需要附加緩存,然後更改對象到數據庫上下文。所以我們稱之爲myContext.Attach(myObject的),並..... BOOM

的嘗試已經取得了附加或 加入,是不是新的實體,也許 已經從另一個 DataContext的加載。這不支持。

有沒有解決這個限制的辦法嗎?

回答

1

聽起來像您的緩存實體仍附加到原始DataContext,它們被查詢。解決這個問題的一個方法(打破保持DataContext生命週期的最佳實踐規則)是將DataContext與實體一起緩存,然後在想要刪除或更新緩存的實體時使用該緩存的上下文。

你提到緩存的實體「兩個請求後」使用 - 如果這些請求都只有很短的時間跨度內發生,再破短生命週期的規則可能不會是一個問題。

另一種選擇是那些基於實體,但那些實體,而當它的時間來更新與存儲在緩存非實體對象的值的實體,查詢上了一個新的DataContext乾淨實體緩存對象,更新這些實體並保存在新創建的DataContext上。

時候還有其他的方法來做到這一點 - 我發現這本書LINQ in Action是在處理這樣的情況下非常有用。

+0

我把這個標記爲答案,因爲「LinqToSql不支持這個」*就是答案。 – 2011-01-18 16:13:52