Где я должен создать экземпляр ObjectContext Entity Framework в трехуровневом приложении

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

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

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

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

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

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

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


person John    schedule 16.02.2012    source источник
comment
OMG, этот вопрос возвращается снова и снова... :) см. мой ответ здесь, это не истина в последней инстанции или единственный путь, но до сих пор у меня было много консенсуса... stackoverflow.com/a/7474357/559144   -  person Davide Piras    schedule 16.02.2012
comment
Спасибо. Однако это не MVC. Вопрос для меня заключается в том, что если я не хочу зависимости от EF в веб-интерфейсе, то как мне работать с POCO и как правильно получать к ним доступ/сохранять/редактировать их.   -  person John    schedule 16.02.2012
comment
все это объяснено в моем ответе, это также относится к веб-формам, оконным формам или WPF, таким слоям вы изолируете пользовательский интерфейс от любой зависимости от EF, NHibernate и т. д.   -  person Davide Piras    schedule 16.02.2012


Ответы (1)


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

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

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

person Ladislav Mrnka    schedule 16.02.2012