То, что вы видите, является результатом шаблона идентификационной карты , используемого инструментами ORM. Каждый объект с уникальным ключом объекта может быть присоединен к контексту только один раз = у вас никогда не будет двух версий объекта с одним и тем же ключом объекта, загруженным дважды в один и тот же контекст.
По умолчанию EF всегда возвращает уже загруженный экземпляр, если ваш запрос возвращает запись с тем же ключом сущности. Это поведение можно изменить, но все равно у вас будет только один экземпляр объекта.
Загружали ли вы объект из EF с тем же экземпляром контекста, который вы собираетесь использовать для сохранения? Если да, у вас уже есть старые значения. Использование:
ObjectStateEntry entry = objectContext.ObjectStateManager.GetObjectStateEntry(yourEntity);
int someIntProperty = (int)entry.OriginalValues["SomeIntProperty"];
Если вы не загружали сущность из того же контекста, вы все равно можете использовать этот подход, но перед этим вы должны заставить EF перезагрузить исходные значения:
objectContext.YourEntitySet.MergeOption = MergeOption.PreserveChanges;
YourEntity entity = objectContext.YourEntitySet.Single(e => e.Id == entityId);
Теперь коллекция OriginalValues
в записи будет заполняться из базы данных.
Другое решение просто использует два разных контекста - один для текущего состояния объекта и один для старого состояния объекта.