62

有沒有一種方法可以確定在實體框架中是否存在未保存的更改?檢查是否有任何未決更改要保存

+0

context.savechanges()不會自動檢查嗎?我想問的原因是我認爲一些人會嘗試做以下事情:'if(db.ChangeTracker.HasChanges()){await db.SaveChangesAsync(); }' – Zapnologica 2015-12-23 03:43:39

回答

57

這可能會實現(如果改變你的意思是添加,刪除和修改實體):

bool changesMade = (context.ObjectStateManager.GetObjectStateEntries(EntityState.Added).Count() + 
        context.ObjectStateManager.GetObjectStateEntries(EntityState.Deleted).Count() + 
        context.ObjectStateManager.GetObjectStateEntries(EntityState.Modified).Count() 
        ) > 0; 

編輯:

改進代碼:

bool changesMade = context. 
        ObjectStateManager. 
        GetObjectStateEntries(EntityState.Added | 
             EntityState.Deleted | 
             EntityState.Modified 
             ).Any(); 
+11

+1通常在正確的軌道上,但使用'Any()',而不是'Count()> 0'。 – 2010-06-29 12:38:30

+0

補充一下 - 今天就閱讀你的博文吧!謝謝;) – Yakimych 2010-06-29 13:05:35

+0

請注意,EF不檢查值是否真的不同(對於'EntityState.Modified')。 e.q.如果你自己替換一個值,EF將返回'1修改對象'。如果值不同,你必須事先檢查。 – 2016-01-05 14:37:15

40

對於那些你使用EF 4+,這裏是作爲擴展方法的等效解決方案:

public static class DbContextExtensions { 
    public static Boolean HasPendingChanges(this DbContext context) { 
     return context.ChangeTracker.Entries() 
         .Any(e => e.State == EntityState.Added 
          || e.State == EntityState.Deleted 
          || e.State == EntityState.Modified); 
    } 
} 

請注意,您不能將這些值組合爲位掩碼。函數GetObjectStateEntries()爲您處理邏輯,但LINQ不會產生正確的結果。

+4

謝謝,接受的答案對我來說並不適用,而你的做法(EF v.4.3)。 – Christian 2013-01-18 14:54:18

+1

'EntityState.Added'的EntityState來自'System.Data.Entity',而不是'System.Data'。 – Yuck 2014-02-17 13:38:08

68

從EF 6開始,有context.ChangeTracker.HasChanges()

+1

最新的答案。 – Zapnologica 2015-12-23 03:42:21

+1

截至2016年,這是答案,恕我直言。 – ozgur 2016-05-02 10:36:27

+0

現在這是其他人提到的最佳答案。 – Yokomoko 2017-03-07 14:04:31

相關問題