2012-12-09 57 views
3

我正在查看EntityFramework.Extended。它可以在db實體上運行Update()和Delete()。像:爲什麼當Update和Delete時EntityFramework.Extended庫不需要調用SaveChanges()?

//delete all users where FirstName matches 
context.Users.Delete(u => u.FirstName == "firstname"); 

但有趣的是,它不需要調用context.SaveChanges(),它只是直接進入數據庫,並刪除記錄。

這是一個糟糕的設計嗎?我認爲對實體的每次修改都需要調用SaveChanges()才能生效,並保持數據庫和內存對象之間的正確關係和映射。

+0

您可能知道這是一個開源庫,請查看它的源代碼以瞭解其原因? – saber

回答

4

您必須瞭解SaveChanges的功能。 SaveChanges提交存儲在當前本地緩存中的對象模型更改。

您所指的庫會生成SQL命令語句,並且不會修改對象上下文。因此,由於對象上下文沒有改變,因此沒有更改保存(換句話說,SaveChanges指的是數據模型,而不是數據庫)。

爲了說明這一點...想象一下你的孩子乘公車去學校和你把他們扔掉的區別。

當他們乘公共汽車去學校時,校車開到各個停車站,然後當公共汽車完成後,所有的孩子立即停車。這有點像調用SaveChanges。

但是當你把你的孩子送到學校的時候,這是一個單一的任務,在你做這件事的時候一次性完成。

+9

問題是,孩子可以在公共汽車上,也可以在車上... – Pawel

1

這在自述文件中進行了說明。 https://github.com/loresoft/EntityFramework.Extended。如果您知道要刪除的內容,並且需要刪除多個實體,則只需轉到數據庫並刪除這些實體,而不是將它們帶到上下文中即可刪除這些實體。這就像使用ExecuteSqlCommand執行SQL命令一樣,但是在這裏沒有看到SQL。另一方面,如果您的上下文正在跟蹤您正在刪除/更新的實體,則很可能最終會看到一些異常情況,因此您需要知道自己在做什麼,爲什麼要這樣做以及何時執行此操作。

+1

感謝您的回答,跟蹤實體就是我所關心的。我擔心,一旦我調用Delete(),記錄在DB中被刪除,但EF不知道它被刪除了,所以它仍然會在內存中保留錯誤的實體。 –

相關問題