Проверьте, есть ли какие-либо оставленные изменения, которые будут сохранены

StackOverflow https://stackoverflow.com/questions/3131347

Вопрос

Есть ли способ узнать, есть ли несохраненные изменения в моем контексте сущности, в рамках объекта?

Это было полезно?

Решение

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

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();

Другие советы

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

Для тех из вас используют 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 не будет производить правильные результаты.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top