получить объект до изменения - PullRequest
1 голос
/ 14 августа 2011

У меня есть две сущности: Product и StockItem.
Когда я вставляю продукт - мне нужно обновить соответствующий StockItem.
Когда я удаляю продукт - я должен также обновить соответствующую StockItem.

Моя проблема заключается в обновлении товара на складе в случае обновления продукта (модификации).Чтобы обновить соответствующий StockItem, мне нужно знать, изменилось ли поле с именем Group в сущности Product.Для этого мне нужно сравнить модифицированную версию сущности с неизмененной версией сущности.Но всякий раз, когда я запрашиваю сущность - структура сущности возвращает присоединенную сущность (а не старую из базы данных).

Как я могу попросить платформу сущностей вернуть старую версию / текущую версию базы данных (до изменения)?

1 Ответ

3 голосов
/ 14 августа 2011

То, что вы видите, является результатом шаблона идентификационной карты , используемого инструментами 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 в записи будет заполняться из базы данных.

Другое решение просто использует два разных контекста - один для текущего состояния объекта и один для старого состояния объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...