EF CTP5, какой элемент генерации кода выбрать?

Поскольку EF 4.1 находится на подходе, а CTP5 доступен уже несколько месяцев, я решил опробовать новую функциональность. Как я вижу, доступно несколько элементов генерации (DbContext и три разных ObjectContext's). Я также заметил, что они не являются взаимозаменяемыми — сначала я использовал POCO ObjectContext в одном из своих приложений, а сегодня переключился на DbContext, и весь мой репозиторий сломался. Он был основан на методах LoadProperty(), методах DeleteObject() и AddObject(), и все они отсутствуют в классе DbSet, который используется в поколении DbContext.

Я знаю, что здесь есть отличная серия блогов http://blogs.msdn.com/b/adonet/archive/2011/01/27/using-dbcontext-in-ef-feature-ctp5-part-1.-introduction-and-model.aspx представляет новую функциональность, но никогда не говорит, когда что выбирать.

Мои требования:

  • Приложение ASP.NET MVC, поэтому ленивая загрузка в основном не будет работать, потому что при рендеринге страницы будет сказано, что контекст уже удален (поэтому мне нужна простая поддержка для явной загрузки - в EF4 я сделал это через Include(), используя контекст POCO I сделал это через LoadProperty() и теперь в DbContext я думаю, что буду использовать строго типизированный Include()).
  • Нам, вероятно, не понадобятся функции, ориентированные на код (но кто знает).

comment
в идеале ответ будет содержать плюсы и минусы для каждого из доступных вариантов.   -  person mare    schedule 05.03.2011


Ответы (2)


Разница между этими двумя в основном заключается в API и набор функций. DbContext конечно есть Include для запроса и Load но вы найдете его в другом месте. Более того, при использовании сборки CTP5 у вас будет строго типизированный Include как для ObjectSet, так и для DbSet (доступен в интерфейсе IQueryable в качестве метода расширения).

Явная загрузка (эквивалент LoadProperty) выполняется методом Load на DbReferenceEntry<T> или DbCollectionEntry<T> — проверьте явная загрузка связанных объектов. Это работает даже лучше, чем LoadProperty, потому что вы можете определить фильтр для загрузки.

person Ladislav Mrnka    schedule 05.03.2011

Вы начинаете с неправильного предположения, что вы не можете использовать ленивую загрузку с MVC.

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

person Diego Mijelshon    schedule 05.03.2011
comment
Ознакомьтесь со многими примерами, которые существуют для сеанса на запрос с использованием NHibernate. NH ISession примерно соответствует EF DbContext - person Diego Mijelshon; 07.03.2011
comment
Я не использую NHibernate, но у меня есть IoC с Ninject и контекст для каждого запроса, я думаю, это все. Однако отложенная загрузка в этой конфигурации не работает с контекстом POCO, но работает с DbContext (только сегодня попробовал). - person mare; 07.03.2011