Entity Framework 4 против NHibernate

Много говорилось о первой версии Entity Framework в Интернете (также в stackoverflow), и ясно, что это был не лучший выбор, когда у нас уже была лучшая альтернатива, например, NHibernate. Но я не могу найти хорошее сравнение Entity Framework 4 и NHibernate. Мы можем сказать, что сегодня NHibernate является лидером среди всех .NET ORM, но можем ли мы ожидать, что Entity Framework 4 вытеснит NHibernate из этой позиции. Я думаю, что если Microsoft действительно ввела очень хорошие функции в EF4, это может дать хорошую конкуренцию NHibernate, поскольку она имеет интеграцию с Visual Studio, с которой легче работать, и предпочтение всегда предоставляется продуктам MS в большинстве магазинов.

Ответ 1

EF4 имеет готовый ответ в отношении разработки n-уровня в "объектах самоконтроля". Никто не выпустил сопоставимый код для NHib.

NHib имеет множество функций, которые не упоминались как часть EF4. К ним относятся интеграция кеша второго уровня. Он также обладает большей гибкостью в отображении наследования, лучшей интеграцией с хранимыми функциями procs/database/настраиваемыми SQL/триггерами, поддержкой свойств формулы и т.д. ИМО в основном просто более зрелая, как ОРМ.

Ответ 2

Обновление: Я не использовал Entity Framework с версии 4.0, поэтому мой ответ может быть устаревшим. Я все еще использую NH или чистый ADO.NET в своих проектах. И я даже не хочу смотреть, что нового в EF с 4.0, потому что NH работает отлично.

На самом деле довольно легко сравнивать их, когда вы использовали оба. Есть некоторые серьезные ограничения с EF4, я могу назвать некоторые, с которыми я сталкивался сам:

Проблемы EF4:

  • Eager Загрузка и формирование результата: система загрузки EF4 с нетерпением (Include ( "Путь" )) генерирует неправильный SQL с циклом JOIN, который будет выполнять тысячи (не буквально) to-many, тогда написанный вручную SQL (он эффективно неприменим).
  • Материализатор не может материализовать связанные объекты. Если вы думаете, что можете преодолеть предыдущую проблему, предоставив собственный SQL-запрос, вы ошибаетесь. EF4 не может материализовать (сопоставить) связанные объекты с JOIN SQL-запросом, он может загружать только данные из одной таблицы (поэтому, если у вас есть Order.Product, SELECT * FROM order LEFT JOIN Продукт будет инициализировать только объект Order, Product останется null, думал, что все необходимые данные извлекаются в запросе для его инициализации). Это можно преодолеть, используя дополнение сообщества EFExtensions, но код, который вам придется писать для этого, действительно уродлив (я пробовал).
  • Self-Tracking Entities. Многие говорят, что объекты самонаблюдения отлично подходят для разработки N-уровня, включая верхний ответ в этом потоке. Думал, что я даже не попросил их, я могу сказать, что они не являются. Каждый вход может быть подделан, вы не можете просто принимать изменения, которые пользователь отправляет вам, и применять их к базе данных, почему бы не дать прямым данным пользователя базовый доступ? Любой способ, которым придется загружать пользователя данных, должен измениться с БД, проверить, что он существует | не существует, проверяет разрешения и т.д. И т.д. Вы не можете доверять пользователю в состоянии сущности, которую он отправляет на сервер, вы все равно придется загружать этот объект из БД и определять его состояние и другие вещи, поэтому эта информация бесполезна, как и объекты самоконтроля, если вы не используете частную доверенную систему n-уровня для внутреннего использования, и в этом случае, возможно, вы могли бы дать просто Доступ к БД. (Это мои мысли о ST Entities и N-tire, я не очень разбираюсь в N-Tier, так что это может измениться, если я неправильно понял что-то здесь, комментирую это)

  • Регистрация, события, интеграция бизнес-логики: EF4 похож на черный ящик, он что-то делает, и вы не представляете, что он делает. Существует только одно событие OnSavingChanges, где вы можете поместить некоторую бизнес-логику, которую нужно запустить, прежде чем что-то произойдет с БД, и если вам нужно применить некоторые изменения к бизнес-объектам до того, как что-то произойдет, вам придется копать в ObjectStateManager, и это действительно уродливо, код может стать огромным. Если вы, например, используете шаблон репозитория и что должны быть уведомлены об изменениях, внесенных в БД в чистом объекте, вам будет трудно выполнить это с помощью EF.

  • Расширяемость:. Все EF-коды являются частными и внутренними, если вам что-то не нравится (и вам не понравится LOT, если вы серьезно относитесь к использованию EF), никоим образом изменит это простым способом. На самом деле я уверен, что легче написать вам собственный ORM с нуля (я сделал), а затем сделать EF работать по мере необходимости. В качестве примера рассмотрим источник EFExtensions, он основан на методах расширений и разных "хаках", чтобы сделать EF более удобным для использования, а код довольно уродлив (и это не ошибка авторов, когда все в EF является частным, это единственный способ его расширения).

Я могу продолжать писать плохие вещи об EF и как мне было больно работать с ним как на 20 страницах, и, возможно, я буду.

Как насчет NHibernate?. Это абсолютно другой уровень, это похоже на сравнение PHP с С#, EF4 похож на эпоху Каменного века, он, как EF, на 10 лет отстает от NHibernate в развитии, и на самом деле это, Hibernate был начат в 2001 году. Если у вас есть свободное время для изучения и включения Nhibernate, сделайте это.

Ответ 3

Вот вещь. На мой взгляд, NHibernate и Entity Framework действительно предназначены для двух разных аудиторий. NHibernate был бы моим выбором в создании системы со сложными отображениями, формулами и ограничениями (в основном, что-либо предприятие). Если бы я хотел, чтобы я работал с простым доступом к данным, я бы использовал Entity Framework или LINQ-to-SQL. NHibernate не имеет четкого "перетаскивания", как EF. У обоих есть свои сильные стороны и недостатки. Сравнивая их с яблоками и яблоками, откровенно говоря, никуда не денется.

Ответ 4

Если вы думаете, что когда-либо захотите запустить свой код в Mono, NHibernate, вероятно, лучший выбор независимо от того, что говорят контрольные списки функций...

Изменить, 8/13/2012:

Entity Framework был открыт с открытым исходным кодом и теперь включен в Mono с 2.11.3. Этот ответ теперь устарел и на него нельзя положиться.

http://weblogs.asp.net/scottgu/archive/2012/07/19/entity-framework-and-open-source.aspx

Ответ 5

Я считаю, что EF4.0 прошел долгий путь с 1.0 и догоняет Nhibernate в функциональности, но он еще не все.

Однако это Microsoft, из коробки и 100% того, что нужно 95% приложений. Тем не менее, NHibernate делает то же самое в течение многих лет. Приходите версия 5.0 или 6.0 может догнать или даже превысить NHibernate.

Вот мой совет - если у вас есть время, чтобы изучить оба, сделайте это. Существует несколько причин выбрать один из них. Если вы пишете код для корпорации, реалистично ожидать, что смогут быть сотрудниками, которые будут знакомы с EF, так как это во всех книгах и в том, что дети учатся в колледже. Если EF будет отвечать вашим требованиям (думать об этом один долго и упорно, прежде чем просто сказать да), то это прекрасно решения сейчас, и через несколько лет он может (ок, скорее всего, будет) превзойдет NHibernate.

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

Ответ 6

Я думаю, что тот факт, что EF 4 будет иметь возможность использовать POCO и отложенную ленивую загрузку, будет очень большой. Я определенно мог видеть, как он набирает силу с новым выпуском.

Ответ 7

Существует очевидное trend увеличение популярности EF по сравнению с NHibernate, см. рисунок.

NHibernate vs Entity Framework

Ответ 8

Мои 2 цента: мы используем ef на нашем настольном клиенте для некоторых cahing и т.д. - без высоких нагрузок. NHib на стороне сервера - использование сессий без учета состояния, генерация и партии hilo. Является довольно быстрым вложением сообщений 3k + в секунду в секунду. Также он очень гибкий и поддерживает множество dbs, которые имеют решающее значение для нашего продукта.

Ответ 9

Сопоставление непосредственно с хранимыми процедурами с комбинацией Linq для логического уровня кажется самым простым. Нет xml. Создавайте sql только для интересных запросов, которые менее часто используются или не подходят для хранимых процедур.

Объекты загружаются и хранятся через стандартные SP. Этот подход позволяет использовать два входа в sql. Один для доступа к классу через SP (разрешения только для выполнения) и один для логического модуля linq, который обеспечивает прямой доступ к таблице.

Ответ 10

Выбор между ORM по популярности - это не лучшая вещь. Я пытался переехать в EF последние 2 года, и все, что я могу сказать, почему, черт возьми, я все еще пытаюсь?

ATM моя точка зрения об EF: "Это сделано для действительно маленьких довольно крошечных битовых систем с не более чем тремя таблицами с отношением менее 1 (лучше 0)".

И почему я так думаю? 1. Попробуйте обновить отключенный граф и увидеть вашу модельную царапину;

  • Попробуйте сделать TPH с глубоко унаследованными деревьями, и вы обнаружите, что вас распутывают на одну иерархию или система сломается.

  • Попробуйте сделать более громоздкие запросы и наблюдайте, как вся система съедает стек: D... переполнения происходят очень часто.

  • Типы данных XML для карт основаны на расширениях или наиболее "ненавидящих" свойствах NotMapped... и это еще хуже.

  • Попробуйте добавить SQL-запрос в Linq для более мелких запросов, и вы сломаете стену lol.

  • И последнее и самое главное, EF не поддерживает формулу свойств ( "удивительные ресурсы NH для устаревших баз данных" ) и не поддерживает сопоставления сложных типов для одной таблицы и связанных таблиц.

Что мой 10cc.