EF4 ObjectStateManager не сообщает об изменениях?
Я пытаюсь реализовать систему аудита изменений на уровне контекста, используя EF4 (сначала база данных). Я переопределяю SaveChanges
и захват объектов, которые имеют состояние Added
, Deleted
, или же Modified
из контекста ObjectStateManager
, Обычно это работает, но я столкнулся с проблемой, когда ни один из объектов не имеет этого состояния (включая объекты, которые я изменил в коде), но контекст имеет изменения в базе данных. Я зашел так далеко, что посмотрел на список записей с Unchanged
как состояние, и моя измененная сущность находится в этом списке.
Единственное осложнение, которое я вижу, состоит в том, что я использую сущности самоконтроля (поскольку это служба WCF, которая обычно отправляет эти STE клиенту для изменений, затем клиент передает измененный STE резервный файл для сохранения изменений)., Кажется, что происходит то, что объекты, которые извлекаются на сервере и изменяются непосредственно там (а не передаются клиенту и используют STE, ObjectChangeTracker
) не помечены как Modified
, Это нормальное / ожидаемое поведение? Если это так, то ясно, что контекст использует нечто иное, чем ObjectStateManager
определить, какие изменения необходимо сохранить в базе данных, по мере внесения изменений.
Как я могу обнаружить эти изменения и отслеживать их? Кто-нибудь знает, что это за контекст, который используется для отслеживания изменений? Я всегда предполагал, что это ObjectStateManager
, но, похоже, это не так.
1 ответ
Оказывается, проблема с saveOptions
, Поскольку эти параметры (по умолчанию) включают DetectChangesBeforeSave
контекст звонил DetectChanges
внутренне, которая подобрала модификации и правильно установила состояние ObjectStateEntry
, Добавив это в мою процедуру аудита:
if ((options & SaveOptions.DetectChangesBeforeSave) ==
SaveOptions.DetectChangesBeforeSave)
{
DetectChanges();
options ^= SaveOptions.DetectChangesBeforeSave;
}
Теперь это работает правильно.