Самостоятельное отслеживание сущности с помощью «контрольных точек» - PullRequest
0 голосов
/ 30 августа 2011

Я работаю над приложением WPF 4 / Entity Framework 4 (самообследование сущностей). В качестве подтверждения концепции я создаю довольно простой пользовательский интерфейс, связанный с сущностью EF.

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

Я думаю об использовании коллекции OriginalValues, но, как следует из названия, она предоставляет только исходные значения для каждого поля. Я уверен, что мог бы написать некоторый пользовательский код в Очистить коллекцию OriginalValues, когда изменения будут приняты, и затем вернуться к OriginalValues, когда изменения будут отклонены.

Я просто собираюсь в этот момент. Кто-нибудь сделал что-нибудь подобное? Есть ли хорошие примеры?

Спасибо большое!

Ответы [ 3 ]

1 голос
/ 30 августа 2011

STE не поддерживают это, они просто шаблонные, поэтому вы можете реализовать любую дополнительную логику, какую захотите. Если вы не собираетесь делать большую переопределение STE, вы должны использовать очень простой подход, основанный на паттерне GoF Memento . Как только пользователь примет изменения, создайте глубокий клон вашей сущности (сериализация с последующей десериализацией сделает глубокую копию) и сохраните ее где-нибудь в памяти. Если пользователь отклоняет изменения, просто отбросьте текущую сущность и вместо этого выберите сохраненный клон. STE должны быть сериализуемыми с DataContractSerializer по умолчанию.

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

Другое решение - расширить сущности с помощью свойства IsModified, используя T4 и словарь имен / значений свойств.

Вам нужно написать метод, чтобы получить все сущности в графе, гдеизменено и затем обработать изменения соответственно.

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

Я использую EF 4 STE таким же образом. Одним из решений, которое я придумал, было повторное использование ChangeTracker в шаблоне T4. Вам нужен второй экземпляр трекера изменений, чтобы отслеживать изменения «сессии». Затем в каждом сеансе необходимо создавать экземпляры средства отслеживания изменений сеанса, а в конце каждого сеанса выбрасывать их. Это можно сделать, не помечая свойства SessionChangeTracker как DataMember, а при десериализации / создании каждого объекта в графе вам потребуется создать экземпляр SessionChangeTracker.

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