2012-06-12 4 views
6

Я пытаюсь решить плюсы и минусы 2 ORM прежде всего в этой области.NHibernate vs. EF 4.1+

  1. Совместимость с Sql Server 2008 R2 & 2012.
    • Это очень важно, так как мы просто не имеют ресурсов для отладки плохой поддержки существующего стека MS технологии.
    • Кроме того, планирование вперед с 2012 года в значительной степени выходит и планирует мигрировать к нему на месте.
  2. Поддержка .NET 4.0 и 4.5 (наступающий)
    • Опять очень важно для почти той же самой причине выше.
  3. Обработка транзакций и настольные подсказки, например. forcecan силаeek, читать неизученный.
    • Много раз оптимизатор запросов хорошо выполняет свою работу, в других случаях я хочу, чтобы гибкость подсказывала ему, что делать.
  4. Поддержка для разговора, саморегулирующаяся присоединять & отрывать
    • Это несколько фундаментально. Ненавижу держать сессию открытой в течение длительного периода. Особенно в среде распределенных вычислений/веб-ферм.
  5. Возможность обработки кода первой разработки, создания и обновления схемы без уничтожения данных.
    • EF 4.1 кажется желающим в этом отношении, хотя 4.3 прыгает и привязывается лучше. Также нравятся аннотации данных лучше, чем отдельные классы отображения в NH. Причина, по которой я хочу иметь возможность отправлять в классе, и оттуда сможет создать модель сохранения, не расширяя метод для классов сопоставления.
  6. Поддержка IRepository шаблон
  7. Поддержка LINQ
    • Несколько привязан к (6) выше, я хочу действительно хорошую поддержку LINQ. Я не хочу, разработчиков слоняться вокруг с реализацией более низким уровня и получать сам прилип к одному конкретному ORM
  8. Производительность
  9. Поддержки для массового CRUD операций, без необходимости загружать данные в слой приложения. Например. Я хочу увеличивать все строки в столбце конкретной таблицы на 1. Я не хочу загружать это в память и наращивать строки один за другим. Это было бы безумным для такой простой операции. Linq2Sql использовал Magiq для обработки такого рода вещей, что у NH и EF?
  10. Кэширование, надежная загрузка, ленивая загрузка, навигационные свойства.
    • Позвольте мне быть откровенным. Я ненавижу эти вещи, когда это делается неявно. Причина в том, что трудно отличить то, что кэшировано, устарело от нового. В EF я обычно отказываюсь от всех свойств навигации, потому что я не хочу, чтобы эти свойства загружались с помощью 5-го уровня, потому что это то, что требуется текущей операции, но дальше по потоку другой разработчик пытается сделать счет, который будет неточным.
    • Итак, моя личная политика - все SOA должны быть без гражданства, если нет веской причины. Если вам нужны ссылки на данные, получите их от настойчивости. Он будет медленнее, но код будет более читабельным и гибким.
    • Аналогично для кеширования. Он достаточно сложный, поскольку он находится в распределенной среде, я хочу, чтобы все кэширование было очень явным. Если разработчик хочет закодировать кеш, он должен сделать это, а не код против ORM, и заставить его выглядеть так, как будто он извлекает свежие данные из состояния, когда на самом деле он получает устаревшие данные.
    • Теперь вопрос в том, имеет ли NHibernate какую-либо концепцию/абстракцию, которая сделала бы кеширование, нетерпеливую/ленивую загрузку намного более явной, чем та, которая в настоящее время доступна в EF. В этом случае меня мало волнует легкость развития, я больше забочусь о ясности и ясности.

Кроме того, я не забочусь много для ОСС против propietary аргумента. Команда не может позволить себе время заглянуть под капот и начать возиться с кодом других людей. Я больше забочусь о том, как «он просто работает», чем что-либо еще.

+5

Ну письменный вопрос, хотя я боюсь, что это немного открыто для SO; вопросы здесь обычно/часто имеют некоторый исходный код и должны приводить к ясным, практическим ответам. Возможно, это лучше подходит для Programmers.SE? – Jeroen

ответ

6

Вы можете использовать bltoolkit;) ->http://www.bltoolkit.net/Doc.Linq.ashx

Просто 2 минуты, чтобы прочитать ->http://www.bltoolkit.net/Doc.LinqModel.ashx

Но в коротких

  • очень хорошая поддержка Linq
  • операций DML (nr 9)
  • отличная производительность/поддержка навалом
  • большого генерироваться Sql
  • поддержка ;-) перечисление
  • нет отложенной загрузки/слежение объекта/особой магии кэширования, теперь эти вещи, которые, как правило, не вызвать проблемы
  • нет волшебных возможностей -> меньше абстракции -> меньше утечек -> меньше неприятностей -> меньше кривое обучение

кстати это Н.Р. 3, он имеет атрибуты TableFunction & TableExpression для поддержки табличных значений UDF, подсказки и другого вокруг стола украшения. Таким образом, вы можете написать свои собственные методы расширения для использования в Linq-заявления , например

[TableExpression("{0} {1} WITH (TABLOCK)")] 
public Table<T> WithTabLock<T>() 
    where T : class 
{ 
    return _ctx.GetTable<T>(this, ((MethodInfo)(MethodBase.GetCurrentMethod())).MakeGenericMethod(typeof(T))); 
} 

, а затем

using (var db = new TestDbManager()) 
{ 
    var q = 
     from p in new Model.Functions(db).WithTabLock<Parent>() 
     select p; 

    q.ToList(); 
} 

Пример операции DML

db.Employee 
    .Where(e => e.Title == "Spectre") 
    .Set(e => e.Title, "Commander") 
    .Update(); 
1

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

Если все эти требования, на планете нет ОРМ, который их встретит.

EDIT:

Основываясь на ваших комментариях. nHibernate даст вам максимальную мощность, но ценой повышенной сложности при настройке вашей модели. Есть некоторые инструменты, которые могут помочь, но у каждого есть свои плюсы и минусы.

EF легче настроить и использовать, но менее мощный. nHibernate - это противоположность. Вы должны выбирать между мощностью и сложностью.

BTW, что касается операций с Bulk, а что нет, вы можете просто вывести SQL непосредственно из фреймворка для таких операций. Или вызовите сохраненную процедуру proc.

+0

Нет. Я собираюсь выбрать наименьшее из 2 зла. Положите это так. – Alwyn

+0

@Alwyn - см. Обновление. –

+0

Спасибо, но мне нужны детали. Я ненавижу неудачную сложность, и мне нужен обоснованный аргумент в пользу того, почему существует сложность. Вышеуказанные вещи, которые я ищу, я хочу знать, как сложность поможет мне достичь этой цели. – Alwyn

8

Прежде всего, я предпочитаю NHibernate в различных аспектах. Entity Framework пропускает что-то еще и в версии 5.0.

  1. очень легко добавить новый тип в NHibernate, так что если SQL Server 2012 имеет новые типы можно реализовать относительный диалект/провайдера, но сообщество всегда работает
  2. Я знаю, что команда NH является работая над поддержкой FW 4.5, EF supports от 5.0
  3. Используя NH вы можете делать все, что вы хотите
  4. NH поддерживает метод Merge повторно прикрепить объект, EF также
  5. EF не поддерживает именование, NH делает, я также пишу авто mapper на основе DataAnnotations, here ссылка на предыдущую версию, подождите 2 недели для новой
  6. Используя NH или EF, вы можете реализовать слой данных с шаблонами репозитория и единицы работы, я должен также выпустить этот пакет на NuGet
  7. EF полностью поддерживает LINQ, NH, но вы можете исправлять, используя расширение point
  8. Я думаю, что показатели на одном уровне, NH лучше поддерживает кеш второго уровня, поэтому легко предотвратить попадание в базу данных
  9. NH имеет улучшенную дозировку support, я не знаю об EF (особенно 5.0)
  10. NH имеет лучшую реализацию точек расширения, поэтому прокси/кэширование/каротаж является мощным, чем EF, но в EF вы можете написать wrapper, чтобы получить то, что вам нужно

в конце концов, с NH проще для реализации шаблона DDD, поскольку сопоставление является более гибким.

+0

Как более гибкое отображение NH? Я нашел API API EF 4 очень гибким, особенно потому, что он определен отдельно от классов сущностей. – jrummell

+0

@MatteoMigliore Мне нравится, что вы подняли поддержку обертки, что было очень полезно знать! Но да, пожалуйста, проясните, почему NH является более гибким, чем EF? EF. Очень многое позволяет вам редактировать edmx и делать картографирование в любом случае, как вы считаете нужным, так же, как и в коде. – Alwyn

+0

Отображение в NH может быть выполнено различными способами. [Read] (http://fabiomaulo.blogspot.it/search/label/Fluent-configuration) сообщения Фабио Моло о картировании. Если вам интересно, подождите, пока мой пакет auto mapper на основе DataAnnotations будет быстро переключаться между NH и EF и наоборот. –

1

Просто, чтобы добавить другие ответы ...

Ricardo Peres написал очень хорошее, объективное сравнение NHibernate и Entity Framework несколько дней назад. Это может помочь вам в ваших исследованиях.

Вы можете найти здесь: http://weblogs.asp.net/ricardoperes/archive/2012/06/07/differences-between-nhibernate-and-entity-framework.aspx

10

В то время как я писал о некоторых из этих вопросов в another question, я думаю, что стоит ответить на этот один пункт за пунктом.

  1. Оба совместимы со всеми версиями SQL Server
  2. Оба совместимы с .NET 4.x. NH по-прежнему ориентируется на 3,5, что не является проблемой.
  3. Оба имеют обработку транзакций. Также не поддерживает подсказки запросов на языках собственных запросов, но оба позволяют использовать SQL.
  4. Оба позволяют повторно подключать отключенные объекты. Я лично не думаю, что это хорошая практика (я предпочитаю передавать DTO вокруг)
  5. Перемещение схемы более зрелое и гибкое в EF. Картирование - путь, лучше в NH. У этого есть поддержка для сопоставления с атрибутами, что намного мощнее, чем эквивалент EF, который вы быстро найдете, не поддерживает даже базовые вещи (например, задание точности десятичного поля).
  6. Вы можете реализовать свой репозиторий поверх либо один.
  7. Обе поддержки LINQ. EF поддерживает более широкий спектр запросов, ценой создания крайне неэффективных. Вы не должны опускать свои методы развития; каждый метод запроса имеет свои преимущества, и хороший разработчик должен знать варианты.
  8. Производительность обычно лучше с NH из-за гибкости ее отображения и поддержки операций пакетной обработки, кэширования и DML
  9. EF не поддерживает операции с массой (DML).NH делает, используя INSERT/UPDATE/DELETE заявления, которые очень похожи на SQL них, но по объектной модели (например, вы можете определить условия, используя точечную синтаксис вместо явного соединения)
    • EF не поддерживает кеширование, период. Есть некоторые неподдерживаемые образцы, которые не готовы к производству. Все кэширование в NHibernate является явным (вы указываете, какие сущности, коллекции и запросы, которые вы хотите кэшировать, как долго и т. Д.). Он поддерживает распределенные кэши, такие как memcached, поэтому он также может следить за устаревшими данными кеша.
    • Оба варианта позволяют явно загружать ссылки и коллекции. У NH есть, на мой взгляд, лучший прокси-дизайн, который не загрязняет вашу модель с помощью FK (это длинная тема, вы можете опубликовать следующий вопрос, если хотите). И как обычно, у вас больше гибкости при определении того, как должны загружаться каждое отношение.

В двух словах: NH является более гибким и лучше исполнительским, руки вниз. EF имеет лучшую поддержку миграции, немного более легкую кривую обучения и более полный поставщик LINQ.

+0

Много хороших ответов, но я считаю, что этот вопрос является наиболее объективным и актуальным для заданного вопроса. Спасибо. – Alwyn

Смежные вопросы