Каковы основные преимущества и недостатки NHibernate и Entity Framework 4.0?
(Отмечая мой вопрос, я заметил больше тегов NHibernate, чем EF. Является ли NHibernate более популярным?)
У меня был очень ограниченный опыт работы с EF (несколько постов в блогах и учебные пособия), но большой опыт работы с NHibernate.
Microsoft неизменно отстает от того, где движется OpenSource, и это определенно имеет место с NHibernate. Когда EF 1.0 был впервые выпущен, в нем отсутствовала поддержка ключевых функций, таких как поддержка POCO и постоянное невежество, требовалось, чтобы ваши классы сущностей расширяли базовый класс сущностей из EF, поэтому ваши классы сущностей не были полностью отделены от EF. Это повлияло на ремонтопригодность и тестируемость устройства, а также на возможность переключения поставщиков ORM в случае необходимости.
С другой стороны, NHibernate позволил вам полностью отделить ваши сущности от самого NHibernate. EF 4.0 несколько догнал в этом отношении, его подход Code First Development ( недавно объявленный Скоттом Гатри ) является шагом в правильном направлении.
Сам NHibernate имеет некоторые очень мощные возможности сопоставления, такие как сопоставление наследования, сопоставление классов компонентов (например, объект Address на объекте Customer), сопоставление однонаправленных ассоциаций объектов. Это позволяет вам в полной мере использовать возможности объектно-ориентированного программирования (инкапсуляция, полиморфизм, наследование и т. Д.) Внутри вашей предметной модели, думать о ваших классах сущностей как о инкапсулирующем поведении, а не только о контейнерах данных. Если вы стремитесь построить модель своего домена в соответствии с принципами доменного управления , тогда NHibernate очень хорошо подходит для этого. Я не могу говорить непосредственно об EF 4.0 по этим вопросам, только из того, что я слышу от других пользователей NHibernate, пытающихся использовать EF 4.0, но EF 4.0 все еще отстает в этих областях, но он набирает силу.
Я бы сказал, что тот факт, что Entity Framework принадлежит Microsoft, является как преимуществом, так и недостатком. Вы получаете фреймворк прямо из того же источника, что и сам .NET. Плохая новость заключается в том, что Microsoft часто устаревает в своей собственной кодовой базе, не обращая внимания на обратную совместимость.
NHibernate не принадлежит Microsoft, и нет никакого другого стандарта, кроме того, что, по словам разработчиков Hibernate и NHibernate, принадлежит их коду. Хорошей новостью является то, что они, как правило, обращали внимание на обратную совместимость. Существует большая база пользователей, потому что Hibernate существует уже некоторое время.
Одна из особенностей, которые мне больше всего нравятся в Spring, заключается в том, что они не принимают такие решения от вас. Spring имеет собственные функции JDBC, но поддерживает Hibernate, TopLink, JDO, iBatis и JPA. Вы также можете свободно вводить свои собственные классы, если решите пойти другим путем (например, NoSQL). Почему ваш выбор должен быть продиктован рамочным выбором? Это очень няня: «Мы - Microsoft; мы знаем, что лучше для вас, чем вы».