2009-05-27 56 views
0

我試圖使用實體框架1.0實現兩階段提交的一種形式。在實體框架中存儲多個更改

我想實現在較高的水平是:

  1. 從數據庫中獲取的所有數據,並存儲這些在緩存中。
  2. 修改單個實體
  3. 提交所有更改到數據庫

的問題是我遇到這麼遠就是緩存一個IQueryable有點毫無意義,因爲它是要回去給數據庫不管。因此,另一種選擇是使用IEnumberable來存儲查詢的結果,但這會阻止我繼承一個查詢並將其改進到另一個查詢中(但我可以忍受這種查詢)。另一個問題是,一旦EntityContext過期(我已經設法堅持當前的httprequest)就是這樣,不能跟蹤任何更改。

有沒有人試圖在過去做類似的事情或得到任何指針?

非常感謝, 馬特

jumpingmattflash.co.uk

回答

0

呼叫.ToList()您從數據庫IQueryable結果。然後開始改進其他查詢使用.AsQueryable()。這應該解決你的第一個問題。

至於你的第二個問題,我也在尋找解決方案。據我所知,實體框架的關係實現部分圍繞着System.Data.Entity程序集的System.Data.Objects命名空間中的ObjectStateManager。這反過來使用System.Data.Metadata.Edm命名空間中的MetadataWorkspace類來查找關係映射。這些可能可以在沒有底層數據庫連接的情況下使用,如果是這樣,將提供一些非常流行的工具來更新複雜的對象圖。

如果上下文具有與單個實體相似的分離和附加方式,那將會很不錯。看起來實體框架的下一個版本將着重於這些特定類型的問題;處理實體和環境時更加自由。

1

IQueryable只是一個可查詢的對象而不是實際的數據。

您需要運行ToList以獲取數據。

如果您可以保持上下文打開並使用transactionscope,則可以執行您正在嘗試執行的操作。但在大多數情況下,這是不可能的。這也會鎖定導致其他問題的數據庫。

一個更好的辦法來做到這一點是:

  • 從數據庫
  • 處置上下文
  • 客戶端的讀數據使得所需的任何變化
  • 打開新的上下文
  • 閱讀數據再次。
  • 通過從改變後的數據複製數據進行更改第二設定
  • 提交更改
  • 處置上下文的