Есть ли способ узнать, есть несохраненные изменения в моем контексте сущности в Entity Framework?
Проверьте, есть ли какие-либо ожидающие изменения, которые необходимо сохранить
Ответ 1
Это может работать (если по изменениям вы имеете в виду добавленные, удаленные и измененные объекты):
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();
Ответ 2
Начиная с EF 6, существует context.ChangeTracker.HasChanges()
.
Ответ 3
Для тех из вас, кто использует 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 не даст правильных результатов.