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

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

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

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

Также проблема (но ее здесь лучше не обсуждать) — если создали в форме новую запись, у которой есть набор подзаписей, не сохраняем пока запись в базу, открываем на редактирование подзапись, жмем "отмена" — и подзапись остается отредактированной — из-за data binding. Тут, видимо, придется колхозить механизм состояний, и черт знает, как он уживется с Object Context.
Re: EntityFramework + WPF - как отменить изменения?
От: opposer  
Дата: 29.09.10 13:54
Оценка:
может как-то похимичить с аттачем-детачем объекта к контексту?
Re[2]: EntityFramework + WPF - как отменить изменения?
От: me2  
Дата: 30.09.10 13:01
Оценка:
Здравствуйте, opposer, Вы писали:

O>может как-то похимичить с аттачем-детачем объекта к контексту?


Как вариант — для списка (например, в табличке) данные брать из view (собирается на сервере, на клиент передается значительно меньше информации), при редактировании — создаем контекст и уже внутри него загружаем/сохраняем сам объект. После окончания операции контекст грохаем. IMHO
Re[3]: EntityFramework + WPF - как отменить изменения?
От: opposer  
Дата: 30.09.10 13:03
Оценка:
Здравствуйте, me2, Вы писали:

me2>Здравствуйте, opposer, Вы писали:


O>>может как-то похимичить с аттачем-детачем объекта к контексту?


me2>Как вариант — для списка (например, в табличке) данные брать из view (собирается на сервере, на клиент передается значительно меньше информации), при редактировании — создаем контекст и уже внутри него загружаем/сохраняем сам объект. После окончания операции контекст грохаем. IMHO


у меня локальное приложение. Вы предлагаете брать в "общем списке" набор прокси-объектов, а в самой форме редактирования по полю ид_объекта, взятому из прокси, брать уже настоящий объект?
Re: EntityFramework + WPF - как отменить изменения?
От: HowardLovekraft  
Дата: 30.09.10 13:13
Оценка: +1
Здравствуйте, opposer, Вы писали:

O>Но: открываем на редактирование ДВЕ записи в разных окнах

"ДВЕ записи в разных окнах" — и вытащены с помощью одного экземпляра контекста?
Категорически не рекомендую так делать. По экземпляру контекста на "окно". Что вы экономите?
Re[2]: EntityFramework + WPF - как отменить изменения?
От: opposer  
Дата: 30.09.10 13:21
Оценка:
Здравствуйте, HowardLovekraft, Вы писали:

HL>Здравствуйте, opposer, Вы писали:


O>>Но: открываем на редактирование ДВЕ записи в разных окнах

HL>"ДВЕ записи в разных окнах" — и вытащены с помощью одного экземпляра контекста?
HL>Категорически не рекомендую так делать. По экземпляру контекста на "окно". Что вы экономите?

я не знал, я бывший нхибернист. А как правильно делать? Какие общепринятые подходы с созданием/уничтожением/использованием контекстов у EF?
Re[3]: EntityFramework + WPF - как отменить изменения?
От: _FRED_ Черногория
Дата: 30.09.10 13:50
Оценка:
Здравствуйте, opposer, Вы писали:

O>>>Но: открываем на редактирование ДВЕ записи в разных окнах

HL>>"ДВЕ записи в разных окнах" — и вытащены с помощью одного экземпляра контекста?
HL>>Категорически не рекомендую так делать. По экземпляру контекста на "окно". Что вы экономите?

O>я не знал, я бывший нхибернист. А как правильно делать? Какие общепринятые подходы с созданием/уничтожением/использованием контекстов у EF?


Кратко — Unit of Work. Это и есть, в некотором смысле, контекст.
Help will always be given at Hogwarts to those who ask for it.
Re[4]: EntityFramework + WPF - как отменить изменения?
От: opposer  
Дата: 30.09.10 13:57
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Здравствуйте, opposer, Вы писали:


O>>>>Но: открываем на редактирование ДВЕ записи в разных окнах

HL>>>"ДВЕ записи в разных окнах" — и вытащены с помощью одного экземпляра контекста?
HL>>>Категорически не рекомендую так делать. По экземпляру контекста на "окно". Что вы экономите?

O>>я не знал, я бывший нхибернист. А как правильно делать? Какие общепринятые подходы с созданием/уничтожением/использованием контекстов у EF?


_FR>Кратко — Unit of Work. Это и есть, в некотором смысле, контекст.


а если не настолько кратко? задача "получить в грид список записей, взять одну из них, отредактировать, сохранить и обновить список"
Re[5]: EntityFramework + WPF - как отменить изменения?
От: _FRED_ Черногория
Дата: 30.09.10 14:11
Оценка: +1
Здравствуйте, opposer, Вы писали:

O>>>>>Но: открываем на редактирование ДВЕ записи в разных окнах

HL>>>>"ДВЕ записи в разных окнах" — и вытащены с помощью одного экземпляра контекста?
HL>>>>Категорически не рекомендую так делать. По экземпляру контекста на "окно". Что вы экономите?
O>>>я не знал, я бывший нхибернист. А как правильно делать? Какие общепринятые подходы с созданием/уничтожением/использованием контекстов у EF?

_FR>>Кратко — Unit of Work. Это и есть, в некотором смысле, контекст.


O>а если не настолько кратко? задача "получить в грид список записей, взять одну из них, отредактировать, сохранить и обновить список"


Первые же две ссылки в гугле:
The Unit Of Work Pattern And Persistence Ignorance
Unit of Work

Здесь два Unit of Work: простотр списка и редактирование. То есть каждое окно редактирования может иметь свой собственный DataContext и список свой собственный DataContext.
Help will always be given at Hogwarts to those who ask for it.
Re[6]: EntityFramework + WPF - как отменить изменения?
От: opposer  
Дата: 30.09.10 14:15
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Здравствуйте, opposer, Вы писали:


O>>>>>>Но: открываем на редактирование ДВЕ записи в разных окнах

HL>>>>>"ДВЕ записи в разных окнах" — и вытащены с помощью одного экземпляра контекста?
HL>>>>>Категорически не рекомендую так делать. По экземпляру контекста на "окно". Что вы экономите?
O>>>>я не знал, я бывший нхибернист. А как правильно делать? Какие общепринятые подходы с созданием/уничтожением/использованием контекстов у EF?

_FR>>>Кратко — Unit of Work. Это и есть, в некотором смысле, контекст.


O>>а если не настолько кратко? задача "получить в грид список записей, взять одну из них, отредактировать, сохранить и обновить список"


_FR>Первые же две ссылки в гугле:

_FR>The Unit Of Work Pattern And Persistence Ignorance
_FR>Unit of Work

_FR>Здесь два Unit of Work: простотр списка и редактирование. То есть каждое окно редактирования может иметь свой собственный DataContext и список свой собственный DataContext.


спасибо! буду курить
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.