UPDATE 2016
Шесть лет спустя ситуация ОЧЕНЬ изменилась. От NHibernate практически отказались, от других альтернатив отказались (например, Subsonic), Entity Framework - это, пожалуй, самый распространенный полнофункциональный ORM, а люди годами переходят на микро ORM вроде Dapper, чтобы с минимальными накладными расходами переходить от запросов к объектам.
Сценарии применения также изменились. Вместо загрузки и кэширования одного большого графа объектов за счет памяти и производительности, веб-сервисы и REST API должны обслуживать большое количество небольших запросов. Это означает, что накладные расходы на полный ORM больше не приемлемы.
Это означает, что такие паттерны и техники, как Active Record, транзакция на запрос и т.д. стали анти-паттернами, убивающими пропускную способность и масштабируемость
Одной из наиболее важных особенностей в настоящее время является асинхронное выполнение, чтобы уменьшить потери потоков и процессора из-за ожидания. NHibernate так и не сделал этого перехода.
Оригинальный ответ
Определите понятие "лучший": Это наиболее зрелый, тот, у которого больше документации, большее сообщество, более популярный?
NHibernate более зрелый, функционально богатый, с более продвинутым сообществом и вряд ли будет снят с производства, когда MS решит снова нарушить совместимость. Entity Framework является более популярным и поддерживается "из коробки". Вы найдете больше книг для начинающих по EF и больше книг для продвинутых по NH.
Хорошим вариантом будет попробовать одну из более простых ORM, например Subsonic, и перейти к более продвинутым ORM, когда вы поймете, как работают ORM, какие есть различные подводные камни, что SELECT N+1
означает [:P]
Только не пытайтесь создать свою собственную ORM, их уже несколько десятков! Subsonic, Castle ActiveRecord, NH, EF (конечно), LLBLGenPro...
Назвать ORM лучшим среди всех с общей точки зрения совершенно невозможно. Каждый из них лучше всех с разных точек зрения. Вы выбрали тот, который лучше всего соответствует вашим потребностям. Linq2Sql был написан с учетом производительности, но ему не хватает поддержки других поставщиков, Linq2Sql очень быстр. Тем не менее, есть другие, которые могут быть не такими быстрыми, как Linq2Sql, когда дело доходит до работы с SQL-сервером, но они поддерживают широкий спектр поставщиков. Лучше всего было бы перечислить функции, которые должна иметь ORM для вашего проекта, и выбрать ту, которая отвечает всем вашим потребностям. «Вы можете задать эти вопросы, чтобы выбрать правильный ORM для своего проекта.
Большинство ORM имеют свои сильные и слабые стороны.
Entity Framework, например, имеет (огромное?) преимущество в том, что он находится в самом фреймворке, но он также довольно тяжеловесен, и его немного сложнее запустить (более крутая кривая обучения).
Есть несколько очень хороших, очень простых в использовании коммерческих ORM. В настоящее время я использую Lightspeed в проекте на C# 4, и очень доволен им для этого конкретного сценария.
Все действительно сводится к тому, что вам нужно от ORM. Если вам нужна очень быстрая и простая настройка и использование, то Lightspeed, subsonic и другие очень хороши. Если вам нужен полный набор функций, то Entity Framework и NHibernate - хорошие варианты.
Если вы можете потратить немного денег, обязательно посмотрите на LLBLGEn Pro 3.0
Если ваш бюджет ограничен, то попробуйте NHibernate
. Это тоже зрелый продукт, но у него более сложная кривая обучения. И если вам понадобится поддержка, вы всегда можете позвонить Ayende :-)
Для небольших проектов хорошим выбором будет EF 4.0.
Я использую Linq-to-SQL в качестве основного ORM при создании приложений C #. В конце концов я перейду к Entity Framework, но пока это действительно просто и быстро.
Я бы согласился с @this. __curious_geek, что выбор правильного ORM зависит от ваших требований. Поработав и с Hibernate, и с Entity Framework, я чувствую, что последний более удобен в использовании, поскольку это редактор на основе графического интерфейса. Что касается богатства функций, преимущество NHibernate заключается в поддержке большого количества поставщиков баз данных. Кроме того, настраивать NHibernate оказалось намного проще, чем Entity Framework".
Если исходить из того, что большинство инструментов удовлетворяют вашим основным требованиям, я бы предпочел NHibernate, поскольку живое и вовлеченное сообщество пользователей - это большой плюс для любого инструмента.