2013-02-06 250 views
1

我可以使用ef 5跟蹤子實體的更改嗎?實體框架5跟蹤更改

實施例:

域對象:書(一對多)頁

var oldBook = context.Books.Include("Pages"); 
context.Entry(oldBook).CurrentValues.SetValues(updatedBook); 

此代碼將更新舊書對象的簡單屬性與從updatedBook對象的簡單屬性的值。

有沒有什麼方法可以追蹤兒童收藏?(本例爲Pages)。或者任何最佳實踐如何做到這一點?

+0

您的意思是一般還是特別用'DBEntityEntry.CurrentValues.SetValues()'? – 2013-02-06 21:02:17

回答

5

您的問題有點含糊不清。

我可以使用ef 5跟蹤子實體的變化嗎?

當然,除非你使用IQueryable.AsNoTracking()MergeOption.NoTracking那麼你可以跟蹤連接到DBContextObjectStateManager任何實體的變化明確禁用更改跟蹤。

如果你實際上是在問,如果有一個功能,你可以這樣做:

context.Entry(oldBook).CurrentValues.SetValues(updatedBook);

而且對整個對象圖的當前值 - 在oldbook是根 - 設爲updatedBook對象圖的更新值,然後,no。

您必須遍歷併爲每個希望更新的頁面調用context.Entry(oldPage).CurrentValues.SetValues(updatedPage)

我認爲您處於斷開連接的情況下,您不能從數據庫中拉出實體並使用自動更改跟蹤並直接在被跟蹤實體上設置修改後的值,否則可以只使用單個對象圖表附加到上下文而不是與兩個實例(即舊書,更新的書籍)一起工作。

如果您已經有一個分離的修改對象圖,您需要使用替代方法來從數據庫中檢索實體並使用SetValues()將實體附加到修改後的上下文。您仍然需要遍歷對象圖中的所有實體。

context.Entry(updatedBook).State = EntityState.Modified; 
foreach(var p in updatedBook.Pages) context.Entry(p).State = EntityState.Modified; 
context.SaveChanges();