2012-02-16 4 views
1

У меня есть трехуровневое веб-приложение с набором простых форм. Один для списка записей, один для редактирования одной записи и т. Д. Работы.Где я могу создать экземпляр ObjectContext объекта Entity Framework в 3-уровневом приложении

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

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

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

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

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

Примечание: EDMX установлен в LazyLoading.

+0

OMG этот вопрос возвращается снова и снова ... :) см. Мой asnwer здесь, это не последняя истина или единственный способ пойти, но я получил много консенсуса до сих пор ... http://stackoverflow.com/a/7474357/559144 –

+0

Спасибо. Однако это не MVC. Вопрос для меня в том, что если я не хочу зависимости от EF в веб-интерфейсе, то как мне обращаться с POCOs и как правильно обращаться/сохранять/редактировать их. – John

+0

, что объясняется в моем ответе, оно применяется также к формам веб-форм или окон или WPF, так как вы изолируете пользовательский интерфейс от любой зависимости от EF, NHibernate и т. Д. –

ответ

1

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

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

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