62

Есть ли способ узнать, есть несохраненные изменения в контексте моего объекта, в Entity Framework?Проверьте, есть ли какие-либо ожидающие изменения, которые необходимо сохранить

+0

Does context.savechanges() не проверяет это автоматически? Причина, которую я задаю, состоит в том, что я думаю, что несколько человек попытаются сделать следующее: 'if (db.ChangeTracker.HasChanges()) {await db.SaveChangesAsync(); } ' – Zapnologica

ответ

57

Это может сработать (если изменения вы имеете в виду добавление, удаление и модифицированные объекты):

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

Edit:

Улучшен код:

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

+1 для того, чтобы быть обычно на правильном пути, но используйте' Any() ', а не' Count()> 0'. –

+0

Darn it - просто прочитайте ваш блогпост об этом сегодня! Спасибо;) – Yakimych

+0

Обратите внимание, что EF не проверяет, действительно ли значение отличается (для 'EntityState.Modified'). e.q. если вы замените значение самостоятельно, EF вернет «1 измененный объект». Вы должны проверить заранее, если значение отличается. –

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

+1

'EntityState' для' EntityState.Added' является 'System.Data.Entity', а не' System.Data'. – Yuck

68

Начиная с EF 6, существует context.ChangeTracker.HasChanges().

+1

Самый последний ответ. – Zapnologica

+1

С 2016 года это ответ, ИМХО. – ozgur

+0

Это лучший ответ, о котором говорили другие. – Yokomoko