Отслеживание изменений с определенного момента времени с EF - PullRequest
0 голосов
/ 11 августа 2011

Свойство EntityState объекта отслеживает состояние объекта EF, начиная с момента времени, когда он был добавлен в DBContext.

Что делать, если я хочу отслеживать изменения с другого момента времени.

Ситуация, которая требует этого: В форме редактирования я пытаюсь предупредить пользователя при выходе о сохранении объекта, если он был изменен. Это не является большой проблемой для существующих объектов, поскольку они помечаются как измененные, когда что-то изменяется. Но для новых сущностей EntityState всегда «добавлен», поэтому я не могу отслеживать, изменилось ли что-либо или нет.

При создании нового объекта я запускаю некоторый код инициализации. Нет необходимости предупреждать пользователя, если новый объект создан, инициализирован, но не изменен пользователем. Поэтому я хочу начать отслеживать изменения сразу после запуска кода инициализации. Излишне говорить, что DBUpdates должны работать как прежде.

Как я могу это сделать?

Примечание: есть несколько возможных решений, которые я придумал. Во-первых, сохраняется оригинальная копия объекта и выполняется сравнение полей по мере необходимости. Другой способ - хранить «измененную» переменную самостоятельно и записывать множество обработчиков событий в элементы управления редактора для ее обновления. Оба являются дорогими, сложными в обслуживании и не рассматриваются как вариант.

Ответы [ 2 ]

0 голосов
/ 12 августа 2011

Я наконец сделал это, отслеживая переменную «Modified» и устанавливая ее в true, если что-то меняется.
Хитрость в том, что я использую событие PropertyChanged объекта, поэтому мне не пришлось писать отдельнообработчики событий для элементов управления редактора.И еще, я прикрепил обработчик событий ПОСЛЕ инициализации объекта, чтобы первоначальные изменения, которые я делаю, игнорировались, а отслеживались только изменения пользователем.

0 голосов
/ 11 августа 2011

Вы должны написать это сами.Невозможно остановить отслеживание изменений для присоединенного объекта или отменить только выбранные изменения.Вы должны сделать клонирование вашей сущности и синхронизировать изменения вручную, если пользователь подтвердит изменения.

Оба варианта дороги, сложны в обслуживании и не рассматриваются как вариант.

Если вы изменяете только одну сущность (не ее отношение), EF предоставит вам единый метод для применения новых значений (DbContext API):

context.Entry(attachedEntity).CurrentValues.SetValues(modifiedClone);

Если вы изменяете граф сущностей (больше связанных сущностей), вам действительно нужноэто вручную.

Редактировать:

То же самое в случае EFv4 с API ObjectContext, и вы можете использовать этот помощник:

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