2012-04-18 113 views
2

我有一些數據從實體模型被拉入。這包含項目的屬性,讓我們說汽車零件與最大速度,重量和大小。由於有很多部分,基本屬性永遠不會改變,所以我已經緩存了所有的記錄。實體框架和緩存 - 變化正在跟蹤回緩存

根據這些部件的使用方式,這些屬性現在可能會改變,所以我設置了一輛新車,將緩存項目「引擎」中的值複製到新車對象,然後添加「TurboCharger」,這提高了發動機的最大速度,重量和尺寸。

我遇到的問題是,似乎實體模型仍在跟蹤上下文到緩存的數據。因此,當通過本地方法增加權重時,會爲所有用戶增加權重。我試圖將「MergeOption.NoTracking」添加到我的上下文中,因爲這應該會刪除所有實體跟蹤,但它似乎仍在追蹤回溯。如果我關閉緩存,它會正常工作,因爲它每次都從數據庫中提取新值。

如果我想從我的實體模型複製一條記錄,有沒有一種方法可以說「複製對象,但把它當作沒有來自實體的歷史的標準對象」,這樣,一旦我的車具有屬性從一個項目,它只是一個扁平的物體?

乾杯!

回答

2

我不太瞭解MergeOption.NoTracking整個上下文以及具體做什麼,但您可以做的替代方法是將.AsNoTracking()添加到數據庫的查詢中。這肯定會返回一個分離的對象。 請看這裏查看AsNoTracking用法的一些細節:http://blog.staticvoid.co.nz/2012/04/entity-framework-and-asnotracking.html

另一件事是確保您枚舉您的集合,然後再插入緩存,以確保您不在可查詢範圍內行事,即使用.ToArray()。

另一種選擇是手動從上下文中分離對象(使用分離(T實體))。

+0

我曾嘗試過使用.NoTracking,但我相信這隻有在您使用DbContext的情況下。但是,你提到Detach(T實體)。我拉我的記錄,在上下文中運行分離(我總是儘管在返回的對象上運行它,而不是上下文!)和BAM,每一件事情都可以在緩存中完美運行!謝謝你,先生! :d – boolean 2012-04-19 01:29:20