Где я должен создать экземпляр ObjectContext Entity Framework в 3-х уровневом приложении? - PullRequest
1 голос
/ 16 февраля 2012

У меня есть трехуровневое веб-приложение с множеством простых форм. Один для записи записей, один для редактирования одной записи и т. Д. Работы.

У меня есть DataLayer, где находится мой EDMX. У меня есть слой приложений, где находятся мои POCO. У меня есть BusinessLayer со всеми классами контроллеров и т. Д. (Не MVC!) У меня есть слой пользовательского интерфейса, где мой веб-интерфейс.

EDMX имеет много-много таблиц с множеством навигационных свойств. Конечно, когда я получаю данные на одном из моих контроллеров, например GetCustomerById (int id), я создаю контекст объекта и закрываю его, когда я закончу.

Однако ObjectContext выходит за рамки, когда я пытаюсь получить доступ к свойствам навигации в слое пользовательского интерфейса.

Должен ли я сделать (using MyContext = new MyContext()) {... } в веб-слое ?? это не кажется правильным. Должен ли я создать другой набор POCO, которые я заполняю из данных сущностей из BizLayer? Что происходит, когда я хочу сохранить данные, введенные в веб-форму? Буду ли я называть контроллер BizLayer, например SaveCustomer ()

У меня вопрос: как вы проектируете слой веб-интерфейса, если я хочу иметь возможность надлежащим образом обращаться к свойствам навигации объекта? Примечание: EDMX установлен на LazyLoading.

1 Ответ

1 голос
/ 16 февраля 2012

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

  1. Вы упомянули некоторый контроллер, который использует контекст и удаляет его. Поэтому сделайте ваш контроллер одноразовым и вместо того, чтобы использовать контекст в каждом методе, используйте один контекст для всего срока службы контроллера. Удалите контекст в методе контроллера Dispose.
  2. Создайте свой контроллер по запросу. Так, например, вы можете создать экземпляр контроллера в Page.Load и разместить его в Page.Unload.
  3. Используйте свой контроллер и сущности, как хотите. Вся обработка запроса (от Load до Unload) будет выполняться в рамках одного живого контекста.

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

...