Недавно пришлось делать сравнение NHiberante и EF4. Стоит отметить, что мой личный опыт включает в себя только использование NHibernate, и остальные изыскание проводились исключительно с позиции стоит ли EF4 усилий по своему изучению. Вкратце преимущество каждого перечислены ниже.
Преимущества NHibernate
Преимущества EF
Преимущества NHibernate
- Пакетное чтение (MulityQuery, Future)
- Пакетная запись, настраиваемая в конфиге.
- Пакетная ленивая загрузка коллекций, сокращающая проблему N +1
- Сверхленивая загрузка коллекций (Order.OrderLines.Count приводит к select count(*) )
- Возможность постраничной выборки и фильтрации коллекций.
- Разнообразные способы выборки: HQL, ICriteria, QueryOver, LINQ, SQL(включая хранимые процедуры) и трансформации результатов с использованием IResultTransformer.
- Кеш второго уровня.
- Большое количество точек расширения, открывающих широкие возможности по модификации поведения
- Как следствие из предыдущего пункта, существует большое большое количество расширяющих фреймворков. Примеры:
- NHibernate.Envers - аудит
- NHibernate.Validator - думаю понятно :)
- NHiberante.Search - Полнотекстовый поиск с использованием Lucene.Net
- NHibernate.Shards - горизонтальное масштабирование приложений.
- Rhino.Security - библиотека для разграничения прав доступа.
- Разнообразные способы маппинга объектов на бд:
- xml
- аттрибуты
- маппинг кодом (2 отдельных фреймворка + встроенная поддержка)
- по классам
- по соглашениям.
- Более мощный язык объектных запросов (HQL vs Entity SQL), позволяющий выполнять объектные DML-команды без загрузки объектов в память.
- Встроенная поддержка для логгирования генерируемых sql-команд.
- Более 10 разнообразных id-генераторов, включая наиболее эффективные для ORM HiLo и guid.comb.
- Возможность маппинга разнообразных пользовательских типов (шифрованные строки, локализованные свойства, запись Enum как строки, и многое другое)
- Поддержка readonly свойств.
- Поддеркжа коллекций элементов (например IList<int>)
- Поддержка маппинга словарей (Dictionary).
- Сильное сообщество программистов.
Преимущества EF
- Лучшая поддержка LINQ.
- Свойства объектов не обязательно должны быть виртуальными.
- Microsoft.
- Наличие визуального редактора от Microsoft.
Мой выбор очевиден, NHibernate. Остальное решать вам.