Есть ли способ узнать, есть несохраненные изменения в контексте моего объекта, в Entity Framework?Проверьте, есть ли какие-либо ожидающие изменения, которые необходимо сохранить
ответ
Это может сработать (если изменения вы имеете в виду добавление, удаление и модифицированные объекты):
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();
+1 для того, чтобы быть обычно на правильном пути, но используйте' Any() ', а не' Count()> 0'. –
Darn it - просто прочитайте ваш блогпост об этом сегодня! Спасибо;) – Yakimych
Обратите внимание, что EF не проверяет, действительно ли значение отличается (для 'EntityState.Modified'). e.q. если вы замените значение самостоятельно, EF вернет «1 измененный объект». Вы должны проверить заранее, если значение отличается. –
Для тех из вас, используя 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 не даст правильных результатов.
Начиная с EF 6, существует context.ChangeTracker.HasChanges()
.
Самый последний ответ. – Zapnologica
С 2016 года это ответ, ИМХО. – ozgur
Это лучший ответ, о котором говорили другие. – Yokomoko
Does context.savechanges() не проверяет это автоматически? Причина, которую я задаю, состоит в том, что я думаю, что несколько человек попытаются сделать следующее: 'if (db.ChangeTracker.HasChanges()) {await db.SaveChangesAsync(); } ' – Zapnologica