Ответ 1
У меня был очень ограниченный опыт работы с EF (несколько сообщений в блогах и учебники), но у меня много опыта работы с NHibernate.
Microsoft постоянно отстает от движения OpenSource, и это определенно имеет место в NHibernate. Когда EF 1.0 был впервые выпущен, ему не хватало поддержки для таких ключевых функций, как поддержка POCO и незнание невежества, потребовалось, чтобы ваши классы сущностей расширяли класс базовых сущностей из EF, поэтому ваши классы сущностей не были полностью отделены от EF. Это обеспечило ремонтопригодность и модульность, а также возможность переключения поставщиков ORM в случае необходимости.
NHibernate, с другой стороны, позволил вам полностью отделить ваши сущности от самого NHibernate. В этом отношении EF 4.0 несколько подхватил, это подход Code First Development (недавно объявленный Скоттом Гатри) является шагом в правильном направлении.
NHibernate сам обладает некоторыми очень мощными возможностями отображения, такими как отображение наследования, отображение классов компонентов (думаю, объект Address на объекте Customer), однонаправленное сопоставление ассоциаций сущностей. Это позволяет вам в полной мере использовать возможности объектно-ориентированного программирования (инкапсуляция, полиморфизм, наследование и т.д.) Внутри вашей модели домена, подумайте о своих классах объектов как инкапсулирующем поведении, а не только о контейнерах данных. Если вы хотите построить свою модель домена на принципах Domain Driven Design, то NHibernate очень подходит для этого. Я не могу говорить прямо на EF 4.0 в этих точках, только из того, что я слышу от других пользователей NHibernate, пытающихся использовать EF 4.0, но EF 4.0 все еще отстает в этих областях, но набирает силу.