Посмотрите на эту статью . Он предназначен для LINQ to SQL, но может быть легко адаптирован к EF в соответствии с этой статьей . Первая относится к вашему сценарию, где все таблицы имеют необходимые столбцы аудита, а вторая рассматривает использование одной таблицы аудита для всей БД и фактически сохраняет старые и новые значения для каждого изменения.
Я застрял между ними, потому что второй подход не предоставляет средств для идентификации вновь добавленных записей, но у первого нет истории изменений. Мне неудобно реализовывать две стратегии аудита в одном приложении, и мне нужно значение CreatedOn, поэтому мне придется использовать хотя бы первый подход.
Кстати, если вы, как и я, находите сериализацию XML неуклюжим способом хранения истории состояния объекта, вы можете взглянуть на это Специальное решение EF , которое использует таблицу подробностей AuditValues для хранения старых и новых значения измененных свойств, но этот не проверяет вставки вообще.