Автоматическое обнаружение изменений

При использовании большинства сущностей POCO определение того, каким образом изменилась сущность (и, следовательно, какие обновления необходимо отправить в базу данных), обрабатывается алгоритмом обнаружения изменений. Обнаружение изменений осуществляется путем обнаружения различий между текущими значениями свойств сущности и значениями исходных свойств, которые хранятся в моментальном снимке при запросе или присоединении сущности. Методы, представленные в этом разделе, также применимы к моделям, созданным с помощью Code First и конструктора EF.

По умолчанию Entity Framework выполняет обнаружение изменений автоматически при вызове следующих методов:

  • DbSet.Find
  • DbSet. local
  • DbSet. Add
  • DbSet. AddRange
  • DbSet. Remove
  • DbSet. Ремоверанже
  • DbSet. Attach
  • DbContext.SaveChanges
  • DbContext. Жетвалидатионеррорс
  • DbContext.Entry
  • Дбчанжетраккер. записи

Отключение автоматического обнаружения изменений

При отслеживании большого количества сущностей в контексте и многократном вызове одного из этих методов в цикле вы можете значительно повысить производительность, отключив обнаружение изменений в течение цикла. Пример:

using (var context = new BloggingContext())
{
    try
    {
        context.Configuration.AutoDetectChangesEnabled = false;

        // Make many calls in a loop
        foreach (var blog in aLotOfBlogs)
        {
            context.Blogs.Add(blog);
        }
    }
    finally
    {
        context.Configuration.AutoDetectChangesEnabled = true;
    }
}

Не забудьте повторно включить обнаружение изменений после цикла — мы использовали конструкцию try/finally, чтобы убедиться, что она всегда включена повторно, даже если код в цикле вызывает исключение.

Альтернативой отключению и повторному включению является автоматическое обнаружение отключенных изменений в любое время и либо контекст вызова. ChangeTracker. DetectChanges явным образом или используют прокси-серверы отслеживания изменений более тщательно. Оба эти варианта являются расширенными и могут легко добавить в приложение небольшие ошибки, чтобы использовать их с осторожностью.

Если необходимо добавить или удалить несколько объектов из контекста, рассмотрите возможность использования DbSet. AddRange и DbSet. Ремоверанже. Эти методы автоматически обнаруживают изменения только один раз после завершения операций добавления или удаления.