Entity Framework ObjectContext в приложении Windows / WPF / Silverlight - PullRequest
5 голосов
/ 22 декабря 2009

Мы пишем приложение WPF, используя Entity Framework (Silverlight с RIA-сервисами, если быть точным). Мы используем общий ObjectContext через приложение, чтобы мы могли извлечь выгоду из совместного использования данных между модулями.

Проблема в том, что если пользователь во время своей работы открывает, скажем, исторические продажи, он загружается в ObjectContext и остается там до конца приложения. Таким образом, следует использовать другой шаблон.

Я знаю, что ObjectContexts следует использовать как одну единицу работы. Но тогда как вы сообщите другим частям приложения, что что-то изменилось, и им следует перезагрузить свои данные?

Редактировать: ОК, EventAggregator, но тогда это заставит все другие части перезагрузить свои (вероятно, большая часть дублирует) данные. Также, вероятно, понадобится много событий для всех типов групп участников.

Как вы решаете эти проблемы? Мое текущее решение является своего рода компромиссом - используйте общий ObjectContext для основных данных, используемых целым приложением, чтобы они могли совместно использоваться и обновляться автоматически. А для большого объема данных используйте новый отдельный ObjectContext. Есть идеи получше?

Есть ли способ, как "освободить" сущности из их DataContext, чтобы сборщик мусора мог выполнить свою работу и освободить память?

Ответы [ 4 ]

2 голосов
/ 03 января 2010

Подождите, это WPF или Silverlight? В этом случае они очень разные, и мой ответ будет другим.

WPF Solution

В WPF я бы создал один ObjectContext для формы . Таким образом, контекст будет длиться столько же, сколько и сама форма. Затем следует внедрить систему событий, чтобы при сохранении изменений в сущности вы могли предупреждать другие формы о том, что им может потребоваться обновить свои данные (например, INotifyPropertyChanged ). Орен Эйни написал довольно хорошую статью об этой архитектуре с использованием NHibernate в журнале MSDN . Вы должны быть в состоянии получить концепцию архитектуры из его статьи.

Решение Silverlight

Теперь Silverlight другой. Silverlight, по сути, позволяет вам иметь только одну форму в вашем приложении. Да, есть некоторые приемы, которые вы можете сделать, чтобы перемещать корневой визуальный элемент формы к разным «страницам», но это все еще только одна форма, и пользователь не может открыть несколько окон в одной Silverlight RIA. Из-за этого я бы сделал один .Net RIA Services ObjectContext на экземпляр Silverlight RIA . Помните, что службы RIA не являются фактическим подключением к вашей базе данных, это просто объект кэширования и отслеживания изменений, связанный с веб-службой. Таким образом, вполне приемлемо оставлять этот объект в существовании на более длительные периоды времени, поскольку он не связывает ресурсы сервера. Если ваша Silverlight RIA открывает несколько окон браузера или имеет более одного объекта Silverlight, то у вас должен быть один ObjectContext на экземпляр Silverlight.

На сервере вы используете Entity Framework ObjectContext в веб-сервисе, и он должен работать только в течение одного запроса . Чем больше у вас нет состояний, вы можете сделать их более масштабируемыми и эффективными. Вы хотите открыть свой EF ObjectContext, использовать его и закрыть как можно скорее.


EDIT:

Если все, что вы хотите сделать, это отсоединить объект от контекста объекта, то вы можете просто использовать метод context.Detach(entity). Вы можете найти пример того, как это сделать на MSDN .

1 голос
/ 23 декабря 2009

Вы можете использовать шаблон хранилища. Дополнительный уровень абстракции между пользовательским интерфейсом и DAL.

Сделать сбор данных в хранилище статичным и наблюдаемым. Затем всякий раз, когда репозиторий обновляет любой из них, уровень пользовательского интерфейса должен наверстать упущенное. Просто идея.

0 голосов
/ 05 сентября 2011

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

Большая статья о времени жизни контекста объекта: http://www.silverlightshow.net/items/Silverlight-WCF-RIA-Services-strategies-for-handling-your-Domain-Context-part-one.aspx

0 голосов
/ 03 января 2010

Используйте ObservableCollections в ObjectContext. Используйте событие, которое срабатывает на NotifyPropertyChange. Используйте шаблон публикации / подписки между моделями представления, чтобы сообщить им об изменениях, и используйте его для обновления других представлений.

...