2011-01-28 18 views
8

如何使用DbContext和使用Repository模式對CTP 5執行更新操作?早些時候用EF 4.0,它可以像下面這樣完成。實體框架CTP 5 - 存儲庫模式 - 正在執行更新

_context.Customers.AddObject(item); 
_context.ObjectStateManager.ChangeObjectState(item, System.Data.EntityState.Modified); 

是否有任何理由說明爲什麼EF沒有提供簡單的方法來更新「斷開」的實體。我不想查詢數據庫並將所有屬性複製到從查詢返回的對象。換句話說,EF應該具有接收實體的更新方法(類似於Add方法)。如果entitykey已經存在於數據庫中,則用當前值更新實體。即爲什麼我們應該執行「附加」,然後將所有屬性複製到附加對象。對我來說,複製實體的所有屬性似乎是多餘的,只是爲了在「已斷開連接」的對象已經存在時進行更新。

回答

8

我相信你仍然可以執行同樣的方法,在你的代碼示例更新與CTP5的DbContext斷開連接的實體:

_dbContext.Customers.Add(item); 
DbEntityEntry entry = _dbContext.Entry(item); 
entry.State = EntityState.Modified; 

_dbContext.SaveChanges(); 

望着生成的SQL這創造過程的完全更新語句上的所有客戶對象的屬性包括實際上並未改變的屬性,因爲EF不知道數據庫中當前的狀態。如果你想避免這種情況,我想有沒有其他辦法比可以做到這樣的更新之前在數據庫中獲取的當前狀態:

DbEntityEntry entry = _dbContext.Entry(_dbContext.Customers.Find(item.ID)); 
entry.CurrentValues.SetValues(entity); 

_dbContext.SaveChanges(); 

(這裏假設你對你的客戶有一個關鍵ID對象「項目)。)

這將創建一個SQL更新語句,該語句只包含與數據庫中狀態相比確實已更改的屬性。由於附加的select語句,我不確定第二種方式是否是性能較差的選項。如果對象類型很大,但只有很少的屬性發生了更改,則在所有字段上發送完整更新語句的開銷可能會大於select語句以及僅包含真正需要更新的字段的「小」更新語句。 (但這只是猜測,我不是SQL Server專家。)

+0

這正是我所期待的。謝謝。我在這方面有另一個問題,在http://stackoverflow.com/questions/4167033/entity-framework-poco-with-foreign-keys的評論中提到。讓我知道你的想法。 「如何在EF CTP 5中使用DbContext並使用」Ado.net DbContext生成器「?沒有固定代碼,因此設置DirectorId不會清除Director。設置DirectorId後始終設置movie.Director = null my唯一的選擇?「 – Jonna 2011-01-28 18:17:35

相關問題