У Вас будут проблемы с сериализацией набора, если объекты в наборе будут содержать какую-либо ссылку на другие объекты в том же наборе. Если какой-либо тип двойного указания существует, Вы заканчиваете тем, что создали мультикарту, которая не может быть сериализирована. На каждой проблеме у меня когда-либо была сериализация пользовательского набора, всегда из-за некоторой добавленной функциональности мне было нужно, который хорошо работал как часть "типичного" клиент-серверного приложения, и затем потерпел полный провал как часть потребительского серверного приложения поставщика.
Проверьте интерфейс IEditableObject
. Ваш класс Customer
должен реализовать это, и ваши команды могут выполнять BeginEdit
/ CancelEdit
/ EndEdit
в зависимости от ситуации.
In this article, Raul just reload the object from the DB. I guess it's less trouble than the solution Kent proposes.
internal void Cancel(CustomerWorkspaceViewModel cvm)
{
Mainardi.Model.ObjectMapping.Individual dc = cvm.DataContext
as Mainardi.Model.ObjectMapping.Individual;
int index = 0;
if (dc.ContactID > 0 && dc.CustomerID > 0)
{
index = _customerCollectionViewModel.List.IndexOf(dc);
_customerCollectionViewModel.List[index] =
_customerBAL.GetCustomerById(dc.CustomerID);
}
Collection.Remove(cvm);
}
Вы также можете в своей ViewModel скопировать состояние модели во внутренние поля, а затем раскрыть их и установить только в модели, когда пользователь действительно совершит изменение.
Проблема может заключаться в том, что проверка на лету будет более проблематичной, если проверка зависит от обновления сущности - если это требование, вы можете создать клон модели для работы, а затем объединить клон с реальной сущностью при ее сохранении.
Очень простой способ, если ваш объект уже сериализуем, например, если вы используете WCF. Вы можете сериализовать исходный объект во внутреннее поле. Если ваш объект не сериализуемый, просто используйте AutoMapper , чтобы создать копию вашего объекта с помощью одной строчки кода.
Order backup = Mapper.Map<Order, Order>(order);
Когда вы обрабатываете команду CancelCommand, просто вызывайте AutoMapper в обратном порядке. Поскольку у ваших свойств уже есть уведомление об изменении, все просто работает. Возможно, вы можете комбинировать эти методы с IEditableObject, если вам нужно и вы хотите написать дополнительный код.