Entity Framework - жизненный цикл ObjectContext

Я новичок в Entity Framework и задаю вопрос о жизненном цикле ObjectContext в приложении WinForm с базой данных.

Для иллюстрации предположим, что я создаю регистр видов животных.

  • В левой части формы у меня есть список видов животных (корова, свинья, собака и т. д. - я думаю, что это род, а не вид, но неважно!). </Р>

  • Справа от формы у меня есть текстовые поля, comboboxes и т. д., чтобы отображать и разрешать редактирование свойств выбранного вида.

Когда пользователь выбирает вид слева, я использую:

var species = context.Single(x =>  x.id == speciesID);

затем привяжите различные элементы управления справа к species .

Некоторые из этих свойств, таких как среда обитания, выбираются из combobox (заполняется из базы данных, когда загружается форма. Я использую суррогатные ключи в базе данных), что означает, что мне кажется, что мне нужно поддерживать один и тот же контекст для жизни формы.

Я думаю, что есть две проблемы:

  1. Пользователь может вносить изменения во многие разные виды (несколько сотен существуют) в течение жизни контекста, заставляя его раздуваться.

  2. В идеале я хотел бы предложить пользователю выбрать новый вид, если они хотят сохранить изменения в текущем (если они грязные) перед изменением. Как же я отбрасываю изменения - как я могу заставить контекст забыть, что он когда-либо видел объект?

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

Я что-то упускаю?

Большое спасибо

1
nl ja de
Я думаю, что лучший способ отказаться от изменений - избавиться от контекста и заселить его. Поскольку EF использует ленивую загрузку (если не указано иное), вы не получите ничего, что вы на самом деле не используете. Контекст EF используется для использования в шаблоне Unit of Work.
добавлено автор Elad Lachmi, источник

2 ответы

Я бы предложил использовать новый контекст для изменения видов - это решило бы проблему отмены изменений, если это необходимо.

Я не понимаю, почему вам нужно повторно заполнять свои поле со списками каждый раз, когда вы отбрасываете контекст. Я предполагаю, что эти объекты не будут изменены одновременно с изменением видов. Таким образом, вы можете использовать Прикрепить метод на этих объектах, чтобы сделать их частью текущего контекста объекта (ИЛИ вы можете использовать ключ/идентификатор выбранного объекта для запроса объекта из базы данных с текущим контекстом объекта).

0
добавлено
@ChrisBeedie, либо вы можете перечислить все среды обитания и прикрепить их к контексту, либо вы можете привязать выбранную среду обитания к вызову для сохранения изменений. В любом случае у вас может быть общий код, который может заботиться обо всех комбинированных коробках.
добавлено автор VinayC, источник
Спасибо, мне нравится звук первого варианта, но как я могу привязать все сущности из combobox? Скажем, у меня были среды IQueryable ; Нужно ли перечислять и называть их присоединением? Я не уверен, что понимаю второй вариант, который вы упомянули.
добавлено автор Chris Beedie, источник

Я думаю, вы найдете свой ответ в этой теме:

Отменить изменения в сущностных сущностях

0
добавлено
Microsoft Stack Jobs
Microsoft Stack Jobs
1 788 участник(ов)

Work & freelance only Microsoft Stack. Feed https://t.me/Microsoftstackjobsfeed Чат про F#: @Fsharp_chat Чат про C#: @CSharpChat Чат про Xamarin: @xamarin_russia Чат общения:@dotnettalks

Microsoft Developer Community Chat
Microsoft Developer Community Chat
584 участник(ов)

Чат для разработчиков и системных администраторов Microsoft Developer Community. __________ Новостной канал: @msdevru __________ Баним за: оскорбления, мат, рекламу, флуд, флейм, спам, NSFW контент, а также большое количество оффтоп тем. @banofbot