Истории успеха Entity Framework?

Так как многие разработчики передо мной, я нахожусь на перекрестке выбора ORM, чтобы основательно учиться и продвигаться вперед для будущих проектов. Я играю с Entity Framework и до сих пор, как и то, что вижу, хотя я только пробовал простые вещи, CRUD с четко определенными отношениями в таблице с сопоставлением таблицы 1-1. Я сделал некоторые поисковые запросы на Entity Framework и обнаружил в основном отрицательную обратную связь... что касается меня больше всего - это сложность отображения xml и сгенерированных классов объектов... Кроме того, что они зависят от классов компонентов EF и поэтому их необходимо уважать как таковые, когда речь идет о соображениях проектирования объектной модели. На данный момент я склоняюсь к NHibernate... для относительной простоты файлов сопоставления и того факта, что он может работать с объектами POCO, которые я создаю для удовлетворения потребностей в дизайне объектной модели. Для него есть даже поставщик LINQ, а также инструменты для создания сторонних кодов. Однако... Я еще не хочу бросать EF из окна. Кто-нибудь знает о успешном производственном приложении, написанном с помощью EF? Или с технической стороны, любые причины, которые я хотел бы склонить к EF сейчас, например. имеет корпоративную поддержку, является новой и, следовательно, более вероятно, что она будет расти в совокупности с течением времени, пока NH достигнет равновесия зрелости? Я не собираюсь начинать цветную войну здесь, я просто ищу позитивные вещи, которые люди, возможно, должны добавить о EF, прежде чем я приму решение.

Спасибо!

Ответ 1

Хотя я склонен соглашаться с Тимом о "религиозном" элементе каркасных решений, мне все же кажется немного странным, что так много людей хотят прокомментировать EF, когда они так явно не потрудились узнать, как это работает. Оказывается, EF будет паршивой версией NHibernate, так же как молотки делают плохие отвертки. Важно понимать EF на своих условиях.

Прежде чем обратиться к некоторым вопросам, затронутым в комментариях, я добавлю, что мы только что отправили версию 2 производственного веб-приложения с 0 строками SQL и 100% всего доступа к БД, выполненного через EF или API-интерфейс ASP.NET для наших клиентов. Я говорю здесь с реальным опытом использования EF, что, к сожалению, явно не соответствует авторам большинства комментариев к EF, которые я видел до сих пор.

В общем, я считаю ошибкой распространять типы сущностей. То, что автор сообщения в блоге Tim цитировал (1), не знал, что это возможно, и (2) считает, что это путь внедрения DDD, рассказывает мне все, что мне нужно знать о его реальном опыте EF: у него нет получил.

Поддержка POCO стала очень большой проблемой для пользователей определенных ORM, поскольку на протяжении многих лет они не имели функциональной реализации LINQ. Поскольку вы по существу застряли в том, что объекты типа вышли из черного ящика, контроль над родительским типом стал очень большим делом. Столь большой, по сути, что писать ваши "POCOs" с каждым объявленным пользователем public virtual стал рассматриваться как неважное. На какой планете это "простой" тип? Это прокси-база, а не POCO. Так называемые "POCOs" вообще не являются POCOs. Просто они предпочитают компрометировать инкапсуляцию и производительность, а не родительский тип. Вероятно, это законный компромисс в рамках ограничений их инструментария, но ничего не стоит наглевать.

Но EF работает по-разному; каждый бит так же легко материализовать произвольный тип с помощью прогнозов LINQ в качестве типа, который вы на самом деле отображали. Если вы создаете что-то, чтобы отправлять объекты поверх проводов вместо внутреннего использования и должны иметь клиенты, которые не могут зависеть от EF, тогда вы используете службы RIA или записываете службу данных ADO.NET. Вся тяжелая работа будет сделана для вас. EF является основой для семейства инструментов, которые обрабатывают проблему проектирования данных в БД на различные типы клиентов, а не отдельный автономный инструмент, который пытается обрабатывать каждое преобразование данных, которое приложение может понадобиться внутренне, в одной жирной структуре. Пусть EF обрабатывает проекцию из RDBMS в пространство объектов. Затем вы можете использовать, например, LINQ to Entities, чтобы проектировать в несовместимые типы, или службы RIA для проекта в формате проводника Silverlight. Попросив один инструмент обрабатывать каждую проекцию, любое приложение может когда-либо понадобиться, это попросить застрять в гетто с помощью этого инструмента.

EF основан на понятии "объекты ценности". Это типы со свойствами, но не поведения. Оказывается, что объекты ценности работают очень хорошо для определенных конкретных проблем, таких как отправка данных по проводу или сидение в "ничейной земле" между РСУБД и программированием ОО. Важно понимать разделение проблем здесь.. Точка типов сущностей состоит в том, чтобы получить данные RDB в пространство объектов. Затем вы можете написать типы бизнеса, которые реализуют ваше приложение, и спроецировать типы сущностей на типы бизнеса. Затем у вас есть свобода реализовать свои типы бизнеса с нулевыми компромиссами для сохранения. И при необходимости вы можете изменить схему RDB. Вам нужно только изменить отображение сущности и проекции BO, а не сами BOs.

Ответ 2

Я избавился от Entity Framework 4.1 и никогда не использовал его по следующим причинам:

  • Официальная документация отстой. Существует мало информации о том, как и почему все работает так, как они делают. Нет примеров для чего-либо, кроме базовых сценариев CUD. Например, у меня есть 5 связанных таблиц, и одна атомная операция (транзакция) должна удалить записи из 2 из них, затем добавить одну запись в третью, а затем обновить последние 2 с идентификатором из того, что было просто добавлено. Я могу ясно видеть, что SQL требуется для этого. Теперь в Entity Framework загадка, какая последовательность манипуляций в контексте данных может привести меня к одному и тому же результату.

Есть хорошие статьи и блоги энтузиастов, которые знают это и выходят, но эй, это не то же самое, что смотреть в ссылку и почему я ожидаю, что кто-нибудь узнает это лучше официального документа из официального источника? И почему Microsoft не пытается предоставить своей технологии доступа к флешману более удобное руководство, которое охватывает практические рекомендации, выходящие за рамки примеров их первоклассных книг? Отсутствие информации о том, как его использовать, делает кривую обучения более крутой, что приводит к растратному времени и пропущенным срокам.

  • Невозможно войти внутрь и посмотреть, что он пытается сделать. Это очень хорошо построенный черный ящик. Несмотря на пропаганду использования инъекций IoC и зависимостей, команды Microsoft редко следуют этим принципам в своих продуктах. Структура сущности не является исключением. Большинство основных классов отмечены как запечатанные (EntityConnection, MetadataWorkspace), поэтому вы не можете переопределить метод и посмотреть, что происходит внутри. Метод ToString() работает только с запросами. Если вы хотите увидеть реальные операторы SQL, созданные путем укладки вашего POCO в контекст данных и использования SaveChanges, забудьте об этом, нет способа сделать это. По иронии судьбы вообще нет понятия набора изменений, поэтому что-то, что инкапсулирует ряд модификаций, зарывается во внутренние органы и никогда не подвергается разработчику. Я имею в виду, что нечего называть ToString(), когда дело касается операций CUD.

  • "Дружественные" сообщения об ошибках. Почти каждое сообщение об ошибке - это головоломка, которая занимает в среднем 30 минут работы в поисковых системах и чтениях обсуждений разочарованных разработчиков. Почему так сложно помещать некоторую информацию, которая может помочь устранить проблему прямо в этом сообщении об ошибке darn? Как "Произошла ошибка при получении информации о поставщике из базы данных". лучше, чем "Неизвестная ошибка"?

  • Я не чувствую, что контролирую происходящее и где я нахожусь в каждый конкретный момент. Объекты могут быть ленивы загружены, кэшированы или выведены из базы данных по явному запросу. И я не могу сказать, глядя на объект, в каком состоянии он находится или откуда он происходит. Является ли оно устаревшим, болтающимся или событием, связанным с контекстом? Будет ли Entity Framework убедиться, что она все еще находится в базе данных, когда я связываю ее с другим объектом? Все, на что вы подвергаетесь, - это объекты POCO, обычные коллекции и несколько дополнительных методов в DbContext. Подождите, является ли интерфейс IDbSet (akin ICollection) надмножеством всех операций, на которые способен база данных? Не было бы более справедливым признать, что база данных немного сложнее и, следовательно, требует специальных интерфейсов и дополнительных объектов, которые могли бы четко сообщать о намерении? Учитывая, что Entity Framework делает больше, чем просто тянуть и толкать данные, не имеет ли смысл иметь что-то вроде Cached<TEntity> и LazyCollection<TEntity>, которое расскажет вам историю в то время, когда вы на нее смотрите? Попытка сжать ADO.NET в ICollection и интерфейсы, как жертвуя жизненно важными деталями для простоты, не была умной идеей. Это вредит легкости понимания и создает больше возможностей для непреднамеренных ошибок. Я имею в виду, что объектная модель должна тесно отражать область. Вы не можете игнорировать его или скрывать различия в статических методах класса Database.

В общем, я потратил больше времени, слепо следя за всеми разными способами, чтобы заставить его работать, вместо того, чтобы сосредоточиться на реальной проблеме. Я узнал, что, хотя ADO.NET требует много больше ввода, результат гарантируется в конечном (и не ужасно плохом) времени, в то время как с Entity Framework вы можете потратить пару дней, но ничего не получите. И это огромный разбойник. Итак, нижняя строка: Entity Framework не поможет вам решить вашу бизнес-проблему. Это помогает вам тратить время на постоянную борьбу с еще одной плохо разработанной/документированной технологией только ради ее использования и радости от использования синтаксиса LINQ для простых запросов. Не рискуйте своим временем, это не стоит. Если у вас много времени, попробуйте и попробуйте, это хороший повод для более высокого счета для вашего клиента.

UPDATE:

На положительной ноте. В моем следующем проекте я попробую Entity Framework 5.0. Слава Богу, на этот раз у нас есть исходный код:) Итак, теперь это выглядит не так уж плохо.

Ответ 3

Проблема с этим типом вопроса заключается в том, что существует элемент "религии" в народе, который выбирает рамки, а ОРМ внушает довольно много страсти.

Таким образом, с риском определенных пламен... Я лично не являюсь огромным поклонником Entity Framework, я вижу, где было бы неплохо взять унаследованную систему и модель ER и отобразить ее, но я думаю, что в более долгосрочный (и мой вариант использования) больше построен вокруг проекта модели домена и для моих объектов, которые должны быть сопоставлены с этим. Здесь есть приятный пост в блоге, с которым я склонен соглашаться.

Мне кажется, что мне нравится подход, который используют такие продукты, как NHibernate и Eco. И в настоящее время я экспериментирую с подлинной OODBMS (вместо ORM) с DB4Objects и очень впечатлен до сих пор.

Ответ 4

Короткий ответ: Подождите, пока EF 4.0

Длинный ответ:

Теперь я завершаю проект EF 1.0 среднего размера (также ASP.NET MVC). У меня также есть опыт работы с NHibernate. Помимо общих CRUD-сопоставлений, мы сделали довольно немного моделирования наследования. В целом мои чувства по этому поводу неоднозначны.

Несколько наблюдений:

Самое лучшее, что я могу сказать о EF 1.0, это то, что он имеет отличную интеграцию LINQ. Он лучше Linq для NHibernate (в его текущей версии).

EF может отлично справляться с интересными отображениями наследования, но вы получаете много ошибок отображения, пытаясь понять это правильно. Документация здесь не очень полезна, и пока еще много поддержки сообщества. Вам просто нужно понять это.

Дизайнер неисправен и не поддерживает все, что может сделать EF. Вы часто можете вручную редактировать файлы сопоставления XML. Дизайнер создает ошибки в противном случае правильное отображение xml. На самом деле, у нас было так много проблем с дизайнером, что мы сначала войдем в XML, а не позволяем дизайнеру обновлять сопоставления. Я бы сказал, что это проблема с продуктами Microsoft в целом: они создают продукты, ориентированные на инструменты, а не на библиотеки. В этом случае они спешили с инструментами, потому что XML одинаково плох.

XML is, er, verbose. EF 1.0 требует много информации о сопоставлении. Контраст NHibernate XML, который имеет дело только с самим отображением и не требует концептуального определения или файла определения хранилища или, еще лучше, такого инструмента, как Fluent NHibernate, который позволяет вам указывать ваши сопоставления в коде.

Я лично предпочитаю писать классы, которые могут быть сохранены (POCO), а не иметь дело с отдельной моделью данных. Крейг указывает на публичное виртуальное, несмотря на это, я предпочитаю подход NHibernate proxy. Я должен не согласиться с Крейгом в намерении EF. Я не думаю, что они намереваются создать слой сопоставления между EF и вашими бизнес-объектами. Как частичные классы, кажется, что цель заключается в том, что вы добавляете поведение к своим объектам, чтобы создать полный класс OO. Имея это в виду, вы не можете unit test EF 1.0, не перескакивая через множество обручей.

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

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

Ответ 5

Мы используем NHibernate в InterWorks уже 4 года. Он отлично поработал для нас, и мы создали над ним еще один слой, чтобы упростить использование (аналогично Castle ActiveRecord, о котором мы не знали в то время).

Недостатки NHibernate - это кривая обучения, отсутствие сильного инструмента GUI (мы используем собственные шаблоны MyGeneration для генерации объектов) и поддержку сообщества OK. Мы приложили много усилий, чтобы заставить его работать для нас и потратили немало времени на подготовку новых членов команды в NHibernate и рамки, которые мы создали вокруг него.

Поскольку мы создаем в основном специализированное программное обеспечение, нам сложно оправдать накладные расходы на восстановление нашей инфраструктуры, но, скорее всего, в ближайшие два года мы перейдем к Entity Framework по нескольким причинам. (1) Лучшая документация и более широкое сообщество поддержки (это произойдет быстро) и (2) Легче найти людей с опытом работы в EF, тем самым устраняя некоторые затраты на обучение.

Сегодня это не так, но они будут довольно быстро со следующей версией EF в VS.NET 2010. Он действительно созрел и со встроенной поддержкой VS.NET отлично подходит. Мы провели с ним несколько базовых тестов, но я не претендую на большой опыт работы с EF.

Это для MS, чтобы получить с программой, но теперь, когда у них есть EF, здесь будет долгое время и станет стандартом. Если у вас нет опыта в ORM, я бы начал изучать EF, это будет лучше для вашей карьеры в долгосрочной перспективе.