[редактировать после уточнения параметров порядка]
Я думаю, что легче set up Change Tracking on the server side и не связываться с EF запросов. Отслеживание изменений в ближайшее время ставить:
Плюсы:
- легкая установка
- довольно легко поддержка
- для синхронизации
- еще часть сделки (откат, если транзакция не может)
- нет зависимости от агента SQL
- будет улавливать измененные изменения сторона нормальная операция изменения ORM (хранимые процедуры, вызываемые кода, все изменения, происходящие за пределами вашего приложения)
Минусы:
- не подходит для аудита, которая требует больше информации
- немного медленнее , поскольку он выполнялся синхронно (в отличие от асинхронного характера CDC)
[оригинал ответа]
Один из способов - добавить информацию об изменениях/отслеживании в соответствии с вашими «нормальными» изменениями и охватить все их в рамках одной транзакции.
Вы можете переопределить DbContext
's SaveChanges
и добавить код для отслеживания. Ссылка ChangeTracker позволяет найти все объекты, которые имеют определенное состояние (добавлено, обновлено, удалено, немодифицировано) и, таким образом, также может сохранить тип выполненных изменений. Полный рабочий пример представлен here.
NuGet пакет, кажется, там, чтобы помочь вам с аудирования - TrackerEnabledDbContext
Преимущество этого подхода заключается в том, что вы легко пометить типы сущностей, так что некоторая информация не проверяются (либо реализовать интерфейс или используйте некоторый пользовательский атрибут).
Еще одно преимущество заключается в том, что вы можете еще больше настроить отслеживание изменений, явно указав атрибуты отслеживания на свои свойства.
Недостаток, который я вижу, заключается в том, что транзакции будут длиннее, а блокировка некоторых таблиц будет более продолжительной, что может привести к проблемам с производительностью (это в большой степени зависит от количества транзакций за период времени).
Кроме того, это решение поймает только изменения из вашего контекстного кода (EF), а не другие изменения, которые выполняются непосредственно с базой данных или с помощью хранимых процедур (независимо от того, что они вызываются из внешнего процесса или EF) ,
Другой подход заключается в использовании серверной части (SQL) Change Data Capture, которая улавливает все изменения, внесенные в таблицы, для которых включена эта функция. Одним из важных аспектов CDC является поведение, когда изменяется структура проверенной таблицы. Для получения дополнительной информации читайте this article.
сторона подход Сервер имеет два основных преимущества:
- быстрее, так как это делается асинхронно
- более надежным, если данные изменения происходят из различных источников (вручную, ETL, хранимые процедуры и т.д.).
Не уверен, правильно ли я получил ваш вопрос - из того, что я предположил, вы хотите выполнить chnage_tracking всякий раз, когда обновление выполняется через EF. Возможно, вы можете сохранить procs (с отслеживанием, который вам нужен) для ваших обновлений/добавления/удаления, а затем сопоставить их с объектами EF. Подробнее здесь - http://www.entityframeworktutorial.net/entityframework6/code-first-insert-update-delete-stored-procedure-mapping.aspx. Дайте мне знать, если я неправильно прочитал ваш вопрос. – Developer