EntityFramework + WPF - как отменить изменения?
От: opposer  
Дата: 29.09.10 13:52
Оценка:
Вопрос, как я понял, общеизвестный. Грубо говоря, создали мы контекст, вынули из него список объектов. Один из объектов передали на изменение в какую-нибудь форму. Поля формы привязались к вьюмодели, отредактировались. Объект отредактировался. И нажимаем на форме отмену.

В списке объектов объект будет измененный, несмотря на отмену — вьюмодель все поля записала. Если сделать Context.Refresh(StoreWins, editObject) — в большинстве случаев не прокатывает, потому что если в форме редактировал не элементарные поля объекта, а, к примеру, поле его под-объекта, статус самого объекта останется Unchanged, и рефреш ничего не даст. Проблема широко обсуждается в инете. Как один из предлагаемых вариантов решения, предположим, пересоздаем контекст и вынимаем из него список объектов заново, на гриде теперь актуальный список, всё нормально.

Но: открываем на редактирование ДВЕ записи в разных окнах. Одну из них редактируем, нажимаем отмену. Для отображения актуального грида ПЕРЕСОЗДАЕТСЯ контекст (см. выше). Теперь пробуем сохранить вторую запись — падает, причина — "пытаемся сохранить запись не в том контексте, в котором она была создана".

Вопрос в конечном итоге — как лучше сделать рефреш из базы, не пересоздавая контекст? Чтобы можно было при отмене редактирования просто получить список объектов заново либо отрефрешить состояние отредактированного объекта.

Также проблема (но ее здесь лучше не обсуждать) — если создали в форме новую запись, у которой есть набор подзаписей, не сохраняем пока запись в базу, открываем на редактирование подзапись, жмем "отмена" — и подзапись остается отредактированной — из-за data binding. Тут, видимо, придется колхозить механизм состояний, и черт знает, как он уживется с Object Context.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.