1

Я пытаюсь внедрить систему аудита изменений на уровне контекста, используя EF4 (сначала база данных). Я переопределяю SaveChanges и фиксирует объекты, которые имеют состояние Added, Deleted, или Modified из контекста ObjectStateManager. Это нормально работает, но я столкнулся с проблемой, когда ни одно из этих объектов не имеет этого состояния (включая сущности, которые я изменил в коде), но в контексте есть, которые имеют изменения в базе данных. Я зашел так далеко, чтобы посмотреть список записей с Unchanged в качестве состояния, и мой измененный объект находится в этом списке.EF4 ObjectStateManager не сообщает об изменениях?

Единственное осложнение, которое я вижу, заключается в том, что я использую объекты самоконтроля (поскольку это служба WCF, которая обычно отправляет эти STE клиенту для изменений, тогда клиент передает измененные STE-файлы обратно в сохраняйте изменения). Похоже, что объекты, которые извлекаются на сервере и изменяются непосредственно там (а не передаются клиенту и используются STE ObjectChangeTracker), не помечены как Modified. Это нормальное/ожидаемое поведение? Если это так, то ясно, что контекст использует что-то другое, чем ObjectStateManager, чтобы определить, какие изменения сохраняются в базе данных, так как изменения составляют.

Как я могу обнаружить эти изменения и отслеживать их? Кто-нибудь знает, что это такое, что контекст использует для отслеживания изменений? Я всегда считал, что это был ObjectStateManager, но это, похоже, не так.

ответ

2

Оказывается, проблема связана с saveOptions. Поскольку эти параметры (по умолчанию) включают DetectChangesBeforeSave, контекст вызывал DetectChanges внутренне, который взял изменения и правильно установил состояние ObjectStateEntry. Добавив это в свою аудиторскую процедуру:

Теперь он работает правильно.

Смежные вопросы